如何在Python中将变量用作函数名

时间:2016-01-14 16:25:45

标签: python python-3.x

是否可以在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;
}

6 个答案:

答案 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。

与编译语言中的函数defenition不同,

def是也被执行的语句。因此,当您致电def item():时,您没有为onetwothree定义功能,而是重新定义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'

结果:

关于这个问题的进一步说明现在就等于一个一个地增加条件列表,并根据参数编写相应的函数。之后,上述机制将选择合适的机制。