Python定义动态函数

时间:2010-09-10 19:25:58

标签: python

我有这样的功能:

def activate_field_1():
   print 1

def activate_field_2():
   print 2

def activate_field_3():
   print 3

如何为activate_field_[x]定义x=1:10,而不是输入每一个?{1}}?当然,我宁愿传递参数,但出于我的目的,这是不可能的。

谢谢!

4 个答案:

答案 0 :(得分:18)

您想要静态地在源文件中单独定义这些吗?那么你最好的选择就是编写一个脚本来生成它们。

另一方面,如果您想在运行时使用这些功能,则可以使用更高阶的功能。对于例如

>>> def make_func(value_to_print):
...     def _function():
...         print value_to_print
...     return _function
...
>>> f1 = make_func(1)
>>> f1()
1
>>> f2 = make_func(2)
>>> f2()
2

您可以在运行时再次生成这些列表并存储。

>>> my_functions = [make_func(i) for i in range(1, 11)]
>>> for each in my_functions:
...     each()
...
1
2
3
...

答案 1 :(得分:8)

这里有一些能够像你想要的那样产生完全的函数名称(并且比@ Goutham现在删除的答案中提到的Dynamic/runtime method creation accepted answer稍微简单一些):< / p>

FUNC_TEMPLATE = """def activate_field_{0}(): print({0})"""
for x in range(1, 11): exec(FUNC_TEMPLATE.format(x))

>>> activate_field_1()
1
>>> activate_field_7()
7

Python版本3.6+,可以使用所谓的f-string文字编写如下所示:

for x in range(1, 11): exec(f"""def activate_field_{x}(): print({x})""")

答案 2 :(得分:4)

您可以将新符号放入vars()返回的当前变量绑定的字典中:

for i in range(1, 11):
    def f(x):
        def g():
            print x
        return g
    vars()['activate_field_%d' % i] = f(i)

>>> activate_field_3()
3

但除非你确定需要,否则通常不会推荐这个技巧。

答案 3 :(得分:3)

也许你可以根据自己的需要调整这个配方。

from functools import partial
class FunctionPool:
    def __init__(self,function):
        self.function = function
    def __getitem__(self,item):
        return partial(self.function,item)

>>> @FunctionPool
def func(item,param):
    print "function#{item} called with {param}".format(
        item = item,
        param = param )
>>> f = func[2]
>>> f(3)
function#2 called with 3