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')()
假设我有一个包含以下内容的测试文件:
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')()