带和不带参数的函数字典

时间:2018-05-18 17:10:23

标签: python

我有以下代码:

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

3 个答案:

答案 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