我有这样的功能:
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}}?当然,我宁愿传递参数,但出于我的目的,这是不可能的。
谢谢!
答案 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