Есть ли более Pythonic способ доступа к функциям через их строковое имя? - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть несколько функций (жестко запрограммированы, я не хочу, чтобы 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>]

но есть ли более 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'

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Исходя из ответа 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)>
0 голосов
/ 13 ноября 2018

Определите словарь для хранения ваших функций, а затем используйте понимание списка:

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 не рекомендуется и очень редко необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...