如何将超过 3 个参数传递给 getattr?
How to pass more than 3 arguments to getattr?
我正在学习如何使用 python 的 *args*
和 **kwargs
符号。我正在尝试使用 getattr 将可变数量的参数传递给另一个文件中的函数。
以下代码将获取控制台输入,然后搜索哪个模块包含放入控制台的函数,然后使用参数执行该函数。
while True:
print(">>>", end = " ")
consoleInput = str(input())
logging.info('Console input: {}'.format(consoleInput))
commandList = consoleInput.split()
command = commandList[0]
print(commandList) # Debug print
"""Searches for command in imported modules, using the moduleDict dictionary,
and the moduleCommands dictionary."""
for key, value in moduleCommands.items():
print(key, value)
for commands in value:
print(commands, value)
if command == commands:
args = commandList[0:]
print(args) # Debug print
print(getattr(moduleDict[key], command))
func = getattr(moduleDict[key], command, *args)
func()
output = str(func)
else:
print("Command {} not found!".format(command))
output = ("Command {} not found!".format(command))
logging.info('Console output: {}'.format(output))
我尝试使用带参数的命令,例如我制作的自定义 ping 命令。但是,我得到了这个回溯:
Traceback (most recent call last):
File "/home/dorian/Desktop/DEBPSH/DEBPSH.py", line 56, in <module>
func = getattr(moduleDict[key], command, *args)
TypeError: getattr expected at most 3 arguments, got 4
如何将 3 个以上的参数传递给 getattr
函数?
如果您想将参数传递给函数,您需要在对该函数的调用中使用这些参数。 getattr()
对您正在检索的属性一无所知,也不接受调用参数。
改为这样做:
func = getattr(moduleDict[key], command)
output = func(*args)
getattr()
参数仅采用对象、要从中检索的属性以及可选的默认值(如果该属性不存在)。
请注意,您也不需要在该函数上调用 str()
;充其量您可能希望将函数调用的 return 值 转换为字符串。
回答您提出的问题;你没有。 getattr 只需要两个或三个参数。传递三个参数与您想要做的完全不同:
getattr(object, name[, default])
调用,比方说,getattr(math, "sin")
等同于写 math.sin
。这会在 math
模块中检索名为 sin
的属性,该属性恰好是一个函数。使用 getattr
没有什么特别之处。如果您编写 math.sin(i)
,您将从 math
模块获取属性 sin
并立即调用它。 getattr(math, "sin")(i)
基本上等同于 math.sin(i)
.
因为这就是函数调用的正常工作方式,您需要使用以下代码:
func = getattr(moduleDict[key], command)
func(*args[1:])
这从你的模块中获取命令函数,然后正常调用它,就像你直接调用你模块中的函数一样。不过,这并不是那部分代码中的唯一错误。接下来,你这样写:
output = str(func)
这也是错误的。 func
并没有被您调用的函数的 return 值神奇地替换。如果它以这种方式工作,在你调用 math.sin
之后,再也没有人可以使用 math.sin
。存储在变量中的函数与任何其他函数一样,因此您显然可以像任何其他函数一样检索其 return 值:
func = getattr(moduleDict[key], command)
output = func(*args[1:])
除此之外,那段代码似乎还有最后一个错误。 commandList[0:]
什么都不做。您要求从第一个元素到……最后一个元素的切片。所有这一切都是复制列表。您可能首先想要的是 commandList[1:]
,它将为您提供除命令之外的所有参数。解决这个问题,你会得到:
args = commandList[1:]
func = getattr(moduleDict[key], command)
func(*args)
我正在学习如何使用 python 的 *args*
和 **kwargs
符号。我正在尝试使用 getattr 将可变数量的参数传递给另一个文件中的函数。
以下代码将获取控制台输入,然后搜索哪个模块包含放入控制台的函数,然后使用参数执行该函数。
while True:
print(">>>", end = " ")
consoleInput = str(input())
logging.info('Console input: {}'.format(consoleInput))
commandList = consoleInput.split()
command = commandList[0]
print(commandList) # Debug print
"""Searches for command in imported modules, using the moduleDict dictionary,
and the moduleCommands dictionary."""
for key, value in moduleCommands.items():
print(key, value)
for commands in value:
print(commands, value)
if command == commands:
args = commandList[0:]
print(args) # Debug print
print(getattr(moduleDict[key], command))
func = getattr(moduleDict[key], command, *args)
func()
output = str(func)
else:
print("Command {} not found!".format(command))
output = ("Command {} not found!".format(command))
logging.info('Console output: {}'.format(output))
我尝试使用带参数的命令,例如我制作的自定义 ping 命令。但是,我得到了这个回溯:
Traceback (most recent call last):
File "/home/dorian/Desktop/DEBPSH/DEBPSH.py", line 56, in <module>
func = getattr(moduleDict[key], command, *args)
TypeError: getattr expected at most 3 arguments, got 4
如何将 3 个以上的参数传递给 getattr
函数?
如果您想将参数传递给函数,您需要在对该函数的调用中使用这些参数。 getattr()
对您正在检索的属性一无所知,也不接受调用参数。
改为这样做:
func = getattr(moduleDict[key], command)
output = func(*args)
getattr()
参数仅采用对象、要从中检索的属性以及可选的默认值(如果该属性不存在)。
请注意,您也不需要在该函数上调用 str()
;充其量您可能希望将函数调用的 return 值 转换为字符串。
回答您提出的问题;你没有。 getattr 只需要两个或三个参数。传递三个参数与您想要做的完全不同:
getattr(object, name[, default])
调用,比方说,getattr(math, "sin")
等同于写 math.sin
。这会在 math
模块中检索名为 sin
的属性,该属性恰好是一个函数。使用 getattr
没有什么特别之处。如果您编写 math.sin(i)
,您将从 math
模块获取属性 sin
并立即调用它。 getattr(math, "sin")(i)
基本上等同于 math.sin(i)
.
因为这就是函数调用的正常工作方式,您需要使用以下代码:
func = getattr(moduleDict[key], command)
func(*args[1:])
这从你的模块中获取命令函数,然后正常调用它,就像你直接调用你模块中的函数一样。不过,这并不是那部分代码中的唯一错误。接下来,你这样写:
output = str(func)
这也是错误的。 func
并没有被您调用的函数的 return 值神奇地替换。如果它以这种方式工作,在你调用 math.sin
之后,再也没有人可以使用 math.sin
。存储在变量中的函数与任何其他函数一样,因此您显然可以像任何其他函数一样检索其 return 值:
func = getattr(moduleDict[key], command)
output = func(*args[1:])
除此之外,那段代码似乎还有最后一个错误。 commandList[0:]
什么都不做。您要求从第一个元素到……最后一个元素的切片。所有这一切都是复制列表。您可能首先想要的是 commandList[1:]
,它将为您提供除命令之外的所有参数。解决这个问题,你会得到:
args = commandList[1:]
func = getattr(moduleDict[key], command)
func(*args)