是否有更多Pythonic方式通过其字符串名称访问函数?

Bas*_*asj 3 python variables function

我有一些函数(硬编码,我不希望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
Run Code Online (Sandbox Code Playgroud)

和列表功能:

myfunctions = [f, f, g, f]
Run Code Online (Sandbox Code Playgroud)

如何获取相关的"素数"功能列表?

我在考虑:

myderivatives = [globals()[function.__name__ + '_prime'] for function in myfunctions]
Run Code Online (Sandbox Code Playgroud)

它有效:

[<function f_prime at 0x00000000022CF048>, <function f_prime at 0x00000000022CF048>, <function g_prime at 0x00000000022CF0B8>, <function f_prime at 0x00000000022CF048>]
Run Code Online (Sandbox Code Playgroud)

但是有更多的Pythonic方法来获取与原始版本相关的"主要"功能列表吗?


还有一个角落案例:

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'
Run Code Online (Sandbox Code Playgroud)

jpp*_*jpp 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')]
Run Code Online (Sandbox Code Playgroud)

该解决方案的好处是它精确定义了您希望过滤的功能范围.使用globals不推荐,而很少必要的.