python:stringinpu的分派方法

2024-09-28 23:14:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要编写一个包含3个参数的方法:

  1. 具有函数名的string
  2. 该函数的有序参数list。这包括带有默认值和*varargs的参数,但不包括**kwargs
  3. 表示任何附加关键字参数的dict,如果没有关键字参数,None

我需要使用这个输入来检索一个函数并调用它。例如:

def dispatch(name, args, kwargs=None):
    do_magic_here(name, args, kwargs)

def meth1():
    print "meth1"

def meth2(a, b):
    print "meth2: %s %s" % (a, b)

def meth3(a, **kwargs):
    print "meth3: " + a
    for k,v in kwargs.iteritems():
        print "%s: %s" % (k,v)

我需要这样称呼:

^{pr2}$

我可以这样做:

def do_magic_here(name, args, kwargs=None):
    if name=="meth1":
        meth1()
    if name=="meth2":
        meth2(args[0], args[1])
    if name=="meth3":
        meth3(args[0], **kwargs)

但是我尝试分派40个方法,这个数字可能会扩大,所以我希望有一个更程序化的方法来实现。我在看一些带有getattr的东西,但我不太明白。在


Tags: 方法函数namenone参数ifdefargs
2条回答

我就用

def dispatch(name, *args, **kwargs):
    func_name_dict[name](*args, **kwargs)

^{pr2}$

允许您更自然、更透明地传递args和{}:

>>> dispatch("meth2", 1, 3)
meth2: 1 3

当然,您可以使用globals()或{}来代替dict,但是您可能需要注意每个名称空间中的哪些函数要公开给调用者

事实上,getattr会让你到达那里。在

class X:
    def a(self):
        print('a called')
    def b(self, arg):
        print('b called with ' + arg)

x = X()
getattr(x, 'a')()
# a called
getattr(x, 'b')('foo')
# b called with foo

就像getattr以相同的方式处理方法和字段一样,您可以处理 通过引用locals()或{}与类无关的函数和变量。在

如果要引用全局范围内的函数:

^{pr2}$

例如:

def dispatch(name, *args, **kwargs):
  globals()[name](*args, **kwargs)

dispatch('meth3', 'hello', foo='bar')
# meth3: hello
# foo: bar

请记住,在Python中,始终可以使用**传递参数列表或关键字参数dict:

dispatch('meth3', *['hello'], **{'foo':'bar'})

如果您确实喜欢将参数作为list/dict传递给dispatch

def dispatch(name, args, kwargs):
  globals()[name](*args, **kwargs)

dispatch('meth3', ['hello'], {'foo': 'bar'})

相关问题 更多 >