是否有更Python化的方式通过字符串名称访问函数?

时间:2018-11-13 11:41:12

标签: python function variables

我有一些函数(硬编码,我不希望Python计算派生函数,实际上这些函数更复杂):

def f(x): return x
def g(x): return x ** 2
def f_prime(x): return 1
def g_prime(x): return 2 * x

并列出功能:

myfunctions = [f, f, g, f]

如何获取相关的“主要”功能列表?

我在想:

myderivatives = [globals()[function.__name__ + '_prime'] for function in myfunctions]

它有效:

[<function f_prime at 0x00000000022CF048>, <function f_prime at 0x00000000022CF048>, <function g_prime at 0x00000000022CF0B8>, <function f_prime at 0x00000000022CF048>]

但是还有更多的Python方式来获取与原始版本相关的“主要”功能的列表吗?


还有一个极端的情况:

from module1 import thisfunction as f
def f_prime(x): 
    pass

globals()[f.__name__ + '_prime']  
# doesn't work because f.__name__ + '_prime' is 'thisfunction_prime' and not 'f_prime'

2 个答案:

答案 0 :(得分:5)

定义一个字典来保存您的函数,然后使用列表理解:

funcd = {'f': f, 'g': g, 'f_prime': f_prime, 'g_prime': g_prime}

myderivatives = [func for name, func in funcd.items() if name.endswith('_prime')]

此解决方案的好处是它可以精确定义要过滤的功能范围。不建议使用globals,而且很少使用。

答案 1 :(得分:3)

根据jpp的回答,您可以像这样将函数安排在dict从函数到派生的映射中

In [64]: primes = {f: f_prime, g: g_prime}

In [65]: primes.values()
Out[65]: dict_values([<function g_prime at 0x7f3594174c80>, <function f_prime at 0x7f3594174a60>])

In [66]: primes[f]
Out[66]: <function __main__.f_prime(x)>