是否可以在python中使用变量作为函数名? 例如:
.container {
position:absolute;
bottom:0px;
top: 0;
min-height: 700px; //Adjust this to your MINIMUM (eg your min-top)
}
.position-me {
position: absolute;
bottom: 0;
}
答案 0 :(得分:8)
Python中的函数是具有引用它们的名称的对象,因此您可以传递它们,存储在列表和字典中(在创建跳转表时常用)。
即。这有效:
def one():
print "1"
def two():
print "2"
def three():
print "3"
l = [one, two, three]
for item in l:
item()
将打印:
1
2
3
不要使用list
作为变量名,因为这样可以重新定义buildin。
def
是也被执行的语句。因此,当您致电def item():
时,您没有为one
,two
,three
定义功能,而是重新定义item
名称。
一般来说,你要做的事情并不十分清楚,但这看起来并不是一个好主意。可以解释一下你想要完成什么,或者重新考虑你想要的方式。
答案 1 :(得分:6)
您无法使用变量定义函数,但可以将函数重新绑定到变量名称。以下是将它们添加到模块的全局命名空间的示例。
one = 'one'
two = 'two'
three = 'three'
l = [one, two, three]
def some_stuff():
print("i am sure some stuff")
for item in l:
def _f():
some_stuff()
globals()[item] = _f
del _f
one()
two()
three()
答案 2 :(得分:3)
这是包装在类中的解决方法。它使用字典进行映射:
class function_class:
def __init__(self,fCase):
fDic = {'A':self.A, # mapping: string --> variable = function name
'B':self.B,
'C':self.C}
self.fActive = fDic[fCase]
def A(self): print('here runs function A')
def B(self): print('here runs function B')
def C(self): print('here runs function C')
def run_function(self):
self.fActive()
#---- main ----------
fList = ['A','B','C'] # list with the function names as strings
for f in fList: # run through the list
g = function_class(f)
g.run_function()
输出为:
here runs function A
here runs function B
here runs function C
答案 3 :(得分:1)
简短的回答是否定的。声明变量时,已将名称绑定到对象。声明函数时也是如此。你可以在python控制台中自己试试看看会发生什么:
>name=1
>name
1
>def name(x): print(x+1)
>name
function name at 0x000001CE8B8122F0
答案 4 :(得分:1)
你可以这样做:
from types import FunctionType
from copy import copy
def copy_function(fn):
return FunctionType(copy(fn.func_code), copy(fn.func_globals), name=item,
argdefs=copy(fn.func_defaults),
closure=copy(fn.func_closure))
list = ['one', 'two', 'three']
for item in list:
def _fn():
print(item)
globals()[item] = copy_function(_fn)
list = map(eval, list)
答案 5 :(得分:1)
诀窍是使用globals():
globals()['use_variable_as_function_name']()
等同于
use_variable_as_function_name()
发现于:乔治·萨基斯https://bytes.com/topic/python/answers/792283-calling-variable-function-name
以下是我现在需要的上述询问的有用应用(这就是我来这里的原因):根据URL的性质将特殊功能应用于URL:
l = ['condition1', 'condition2', 'condition3']
我以前写
if 'condition1.' in href:
return do_something_condition1()
if 'condition2.' in href:
return do_something_condition2()
if 'condition3.' in href:
return do_something_condition3()
依此类推-我的列表目前有19个成员,并且还在不断增长。
在研究主题并进行开发时,功能代码已经很自然地成为了主要功能的一部分,使其很快就难以阅读,因此将工作代码重新定位到功能中已经很容易了。
上面的笨拙代码可以替换为:
for e in l: # this is my condition list
if e + '.' in href: # this is the mechanism to choose the right function
return globals()['do_something_' + e]()
这样,无论条件列表增长多长时间,主代码都将保持简单易读。
与条件标签相对应的那些函数必须按照惯例进行声明,这取决于所讨论的URL类型的性质:
def do_something_condition1(href):
# special code 1
print('========1=======' + href)
def do_something_condition2(href):
# special code 2
print('========2=======' + href)
def do_something_condition3(href):
# special code 3
print('========3=======' + href)
测试:
>>> href = 'https://google.com'
>>> for e in l:
... globals()['do_something_' + e](href)
...
========1=======https://google.com
========2=======https://google.com
========3=======https://google.com
或者,使其更接近上述情况:
success = '________processed successfully___________ '
def do_something_google(href):
# special code 1
print('========we do google-specific stuff=======')
return success + href
def do_something_bing(href):
# special code 2
print('========we do bing-specific stuff=======')
return success + href
def do_something_wikipedia(href):
# special code 3
print('========we do wikipedia-specific stuff=======')
return success + href
测试:
l = ['google', 'bing', 'wikipedia']
href = 'https://google.com'
def test(href):
for e in l:
if e + '.' in href:
return globals()['do_something_' + e](href)
>>> test(href)
========we do google-specific stuff=======
'________processed successfully___________ https://google.com'
结果:
关于这个问题的进一步说明现在就等于一个一个地增加条件列表,并根据参数编写相应的函数。之后,上述机制将选择合适的机制。