python 使用 getattr 的更通用的解决方案

python more generic solution for using getattr

假设我有一个包含以下内容的测试文件:

def a():
    print('this is a')

def b(x):
    print(x)

还有一个主文件:

import test


def try_cmd(cmd, params):
    try:
        getattr(functions, cmd)(params)
    except Exception as error:
        print(error)


while True:
    cmd = input('Enter cmd')
    params = input('Enter params')
    do_command(cmd, params)

代码的目的应该是尝试从不同的文件调用一个函数,用户提供函数名称,如果需要,还可以提供参数。 如果 cmd 的值为 'a' 并且 parmas 是一个随机字符串 do_command 将不起作用,因为函数 a 不接受参数。但是,如果 cmd 为 'b' 且 params 为“5”,它将起作用。我如何在不强制 a 接受参数而不实际使用它的情况下解决这个问题。

正如我对你的问题的评论,你应该编写你的函数来接受 *args**kwargs,但是如果你坚持不使用这个约定,试试这个:

def try_cmd(cmd, params):
    func = getattr(functions, cmd)
    try:
        func(params)
    except TypeError:
        func()
    except Exception as error:
        print(error)

在我看来,与使用异常处理来管理分支相比,接受 *args**kwargs 是更好的做法。

如果您已经在导入“测试”文件,您可以查看 locals() 和 globals(),例如:

getattr(locals()['test'],'a')()