如何在 Python 中调用函数?九种方法任你挑选

开发 后端
如果把所有的函数都放在类中,并定义为静态方法,就可以使用getattr()get和调用它们。

1. 直接函数调用

这是最简单、最直观的方式:

  1. def test(): 
  2.     print("This is a test") 
  3. test() 

2. 使用partial()函数

在 的内置库中functools,有一个专用于生成偏函数的偏函数partial。

  1. def power(x, n): 
  2.     s = 1 
  3.     while n > 0: 
  4.         nn = n - 1 
  5.         ss = s * x 
  6.     return s 
  7.  
  8.  
  9. from functools import partial 
  10.  
  11. power_2 = partial(power, n=2
  12. power_2(3)  # output: 9 
  13. power_2(4)  # output: 16 

3. 使用 eval()

如果需要动态执行函数,可以使用 eval + string 来执行函数。

  1. # demo.py 
  2. import sys 
  3.  
  4.  
  5. def pre_task(): 
  6.     print("running pre_task") 
  7.  
  8.  
  9. def task(): 
  10.     print("running task") 
  11.  
  12.  
  13. def post_task(): 
  14.     print("running post_task") 
  15.  
  16.  
  17. argvs = sys.argv[1:] 
  18.  
  19.  
  20. for action in argvs: 
  21.     eval(action)() 

执行:

  1. $ python demo.py pre_task task post_task 
  2. running pre_task 
  3. running task 
  4. running post_task 

4. 使用 getattr()

如果把所有的函数都放在类中,并定义为静态方法,就可以使用getattr()get和调用它们。

  1. import sys 
  2.  
  3.  
  4. class Task: 
  5.     @staticmethod 
  6.     def pre_task(): 
  7.         print("running pre_task") 
  8.  
  9.  
  10.     @staticmethod 
  11.     def task(): 
  12.         print("running task") 
  13.  
  14.  
  15.     @staticmethod 
  16.     def post_task(): 
  17.         print("running post_task") 
  18.  
  19.  
  20. argvs = sys.argv[1:] 
  21.  
  22.  
  23. task = Task() 
  24.  
  25.  
  26. for action in argvs: 
  27.     func = getattr(task, action) 
  28.     func() 

5. 使用 __dict__()

我们都知道对象有一个__dict__()魔法方法,它存储任何对象的属性和方法。

您可以调用类方法使用__dict__.get

  1. import sys 
  2.  
  3.  
  4. class Task: 
  5.     @staticmethod 
  6.     def pre_task(): 
  7.         print("running pre_task") 
  8.  
  9.  
  10. func = Task.__dict__.get("pre_task") 
  11. func.__func__() 
  12. # Output 
  13. $ python /tmp/demo.py 
  14. running pre_task 

6. 使用 global()

在 的内置库中functools,有一个专用于生成偏函数的偏函数partial。

  1. import sys 
  2.  
  3.  
  4. def pre_task(): 
  5.     print("running pre_task") 
  6.  
  7.  
  8. def task(): 
  9.     print("running task") 
  10.  
  11.  
  12. def post_task(): 
  13.     print("running post_task") 
  14.  
  15.  
  16. argvs = sys.argv[1:] 
  17.  
  18.  
  19. for action in argvs: 
  20.     globals().get(action)() 
  21. # Output 
  22. $ python /tmp/demo.py pre_task task post_task 
  23. running pre_task 
  24. running task 
  25. running post_task 

7. 从文本编译和运行

您可以在字符串中定义您的函数,并使用该compile函数将其编译为字节码,然后用于exec执行它。

  1. pre_task = ""
  2. print("running pre_task") 
  3. """ 
  4. exec(compile(pre_task, '', 'exec')) 
  5. # Or from a text file 
  6. with open('source.txt') as f: 
  7.     source = f.read() 
  8.     exec(compile(source, 'source.txt', 'exec')) 

8. 使用attrgetter()

在 的内置库中operator,有一个获取属性的方法,称为attrgetter,获取函数后执行。

  1. from operator import attrgetter 
  2.  
  3.  
  4. class People: 
  5.     def speak(self, dest): 
  6.         print("Hello, %s" %dest) 
  7.  
  8.  
  9. p = People() 
  10. caller = attrgetter("speak") 
  11. caller(p)("Tony") 
  12. # Output 
  13. $ python /tmp/demo.py 
  14. Hello, Tony 

9. 使用methodcaller()

还有一个methodcaller方法在operator

  1. from operator import methodcaller 
  2.  
  3.  
  4. class People: 
  5.     def speak(self, dest): 
  6.         print("Hello, %s" %dest) 
  7.  
  8.  
  9. caller = methodcaller("speak", "Tony") 
  10. p = People() 
  11. caller(p) 
  12. # Output 
  13. $ python /tmp/demo.py 
  14. Hello, Tony 

 

责任编辑:赵宁宁 来源: Python学会
相关推荐

2020-12-11 16:39:16

程序员编程网站

2021-08-18 11:55:25

Python函数代码

2020-09-19 18:03:42

Docker

2017-11-03 10:40:25

Python复制文件方法

2009-06-17 13:19:50

Java调用DLL

2010-04-07 15:47:32

Oracle 11g

2010-04-16 09:06:03

2022-01-16 09:30:34

Ansible自动化工具开源

2023-03-07 15:47:15

2010-04-27 15:39:54

Oracle 11g

2024-04-24 10:47:20

物联网智能建筑

2022-01-17 21:11:32

Windows 11Windows微软

2023-12-21 14:32:51

Python函数

2023-05-17 10:53:43

AICIO

2012-03-27 10:08:08

JavaScript

2011-07-22 12:58:16

服务器管理Android

2020-02-03 09:36:08

物联网智慧城市IOT

2010-07-14 10:53:20

Web应用

2010-11-03 09:21:27

2023-06-02 10:02:17

AICIO供应商
点赞
收藏

51CTO技术栈公众号