我有以下代码:
from functools import partial
def create_droplet(args):
print(args)
def droplets():
print("test")
commands = {
'create_droplet': partial(create_droplet),
}
command_in = input()
command = command_in.split(" ")[:1][0]
if command in commands:
args = command_in.split(" ")[1:]
commands[command](args)
我想要做的是通过将droplets()
添加到'droplets': droplet
来调用commands
,但由于它没有接受任何参数我得到TypeError: droplets() takes 0 positional arguments but 1 was given
答案 0 :(得分:3)
您始终可以使用未使用的参数定义droplets
:
def droplets(unused_args):
print("test")
没有什么大不了的,在这些情况下,通常的做法是你有一些行为取决于输入的行为和其他行为不依赖的行为。
如果你真的希望droplets
不带参数,你总是可以编写一个调用它的包装器:
def droplets_wrapper(unused_arg):
droplets()
将droplets_wrapper
放入commands
词典。
如果您希望同时调用droplets(whatever)
和droplets()
,则只需使用默认参数:
def droplets(unused_args=None):
print("test")
答案 1 :(得分:2)
只需定义一个忽略参数的lambda并调用droplets()
:
commands = {
'create_droplet': partial(create_droplet),
'droplets': (lambda _ : droplets())
}
答案 2 :(得分:2)
最具扩展性的解决方案是标准化commands
中的函数签名。通过使所有函数使用*args
的任意数量的参数并让它们处理参数解析来实现。
这种方法的优点在于,当您需要添加一个函数时,它很容易推广,该函数会为您的dict提供2个参数,并允许您的API正常显示自定义错误消息。这甚至扩展到需要使用**kwargs
的关键字参数的函数。
def create_droplet(*args):
print(args)
def droplets(*args):
# Here you can warn the user if arguments are given
if args:
print('command droplets takes no argument')
return
print("test")
commands = {
'create_droplet': create_droplet,
'droplets': droplets
}
# Here is a one-line way to extract command and arguments
command, *args = input('enter a command: ').split()
if command in commands:
commands[command](*args)
else:
print('command does not exist')
输出示例:
enter a command: create_droplet 1 2
('1', '2')
enter a command: droplets
test
enter a command: droplets 1
command droplets takes no argument