重新引用 python 中的大量函数
Re-referencing a large number of functions in python
我有一个文件functional.py
,它定义了很多有用的函数。对于每个函数,我想创建一个 alias ,在调用时将提供对函数的引用。像这样:
foo/functional.py
def fun1(a):
return a
def fun2(a):
return a+1
...
foo/__init__.py
from inspect import getmembers, isfunction
from . import functional
for (name, fun) in getmembers(functional, isfunction):
dun = lambda f=fun: f
globals()[name] = dun
>> bar.fun1()(1)
>> 1
>> bar.fun2()(1)
>> 2
我可以使用 inspect
从 functional.py
中获取函数,并动态定义一组适合我的目的的新函数。
但是为什么呢?你可能会问...我正在使用配置管理器 Hydra where one can instantiate objects by specifying the fully qualified name. I want to make use of the functions in functional.py
in the config and have hydra pass a reference to the function when creating an object that uses the function (more details can be found in the Hydra documentation).
有很多功能,我不想把它们都写出来...人们在类似的 中指出,为此目的修改 globals()
是不好的做法。我的用例相当受限 - 文档方面有一个一对一的映射(但显然 IDE 无法解决它)。
基本上,我想知道是否有更好的方法来做到这一点!
您的问题与 this feature request and in particular to this 评论有关吗?
仅供参考:在 Hydra 1.1 中,instantiate fully supports positional arguments 所以我认为您应该能够直接调用 functools.partial
而无需重新定义它。
我有一个文件functional.py
,它定义了很多有用的函数。对于每个函数,我想创建一个 alias ,在调用时将提供对函数的引用。像这样:
foo/functional.py
def fun1(a):
return a
def fun2(a):
return a+1
...
foo/__init__.py
from inspect import getmembers, isfunction
from . import functional
for (name, fun) in getmembers(functional, isfunction):
dun = lambda f=fun: f
globals()[name] = dun
>> bar.fun1()(1)
>> 1
>> bar.fun2()(1)
>> 2
我可以使用 inspect
从 functional.py
中获取函数,并动态定义一组适合我的目的的新函数。
但是为什么呢?你可能会问...我正在使用配置管理器 Hydra where one can instantiate objects by specifying the fully qualified name. I want to make use of the functions in functional.py
in the config and have hydra pass a reference to the function when creating an object that uses the function (more details can be found in the Hydra documentation).
有很多功能,我不想把它们都写出来...人们在类似的 globals()
是不好的做法。我的用例相当受限 - 文档方面有一个一对一的映射(但显然 IDE 无法解决它)。
基本上,我想知道是否有更好的方法来做到这一点!
您的问题与 this feature request and in particular to this 评论有关吗?
仅供参考:在 Hydra 1.1 中,instantiate fully supports positional arguments 所以我认为您应该能够直接调用 functools.partial
而无需重新定义它。