代码之家  ›  专栏  ›  技术社区  ›  5xum

调用参数数未知的函数

  •  0
  • 5xum  · 技术社区  · 10 年前

    我试图在python中创建一组函数,这些函数都将对一组输入执行类似的操作。所有函数都有一个固定的输入参数,其中一半还需要第二个参数。为了简单起见,下面是一个只有两个功能的玩具示例。

    现在,我希望在脚本中运行适当的函数,这取决于用户输入的数字。在这里,用户是随机函数(所以最小的例子是有效的)。我想做的事情是这样的:

    def function_1(*args):
        return args[0]
    
    def function_2(*args):
        return args[0] * args[1]
    
    x = 10
    y = 20
    i = random.randint(1,2)
    f = function_1 if i==1 else function_2
    return_value = f(x,y)
    

    这很有效,但对我来说似乎很乱。我宁愿 function_1 定义为

    def function_1(x):
        return x
    

    另一种方法是定义

    def function_1(x,y):
        return x
    

    但这给我留下了 y 参数

    但这不会那么容易。我的方式是解决问题的“正确”方式还是存在更好的方式?

    2 回复  |  直到 10 年前
        1
  •  2
  •   user3012759    10 年前

    这里有两种方法,都添加了更多的锅炉板代码。

    还有这个 PEP 这对你来说可能很有趣。

    但是,由于函数只是类属性,“pythonic”方法并不像通常的函数重载那样优雅。

    所以你可以使用这样的函数:

    def foo(*args):

    然后数数有多少 args 你已经得到了非常广泛但也非常灵活的答案。

    另一种方法是默认参数:

    def foo(first, second=None, third=None)

    不太灵活,但更容易预测,最后您还可以使用:

    def foo(anything)

    并检测 anything 在你的职能中相应地发挥作用。

    您的猴子修补示例也可以工作,但如果您将其与类方法一起使用,它会变得更加复杂,并且确实会使内省变得棘手。

    编辑:此外,对于您的情况,您可能希望保持函数分离,并编写一个“分派器”函数,根据参数为您调用适当的函数,这可能是上面考虑的最佳解决方案。

    编辑2:根据您的评论,我相信以下方法可能适用于您

    def weigh_dispatcher(*args, **kwargs):
        #decide which function to call base on args
        if 'somethingspecial' in kwargs:
            return weight2(*args, **kwargs)
    
    
    def weight_prep(arg):
        #common part here
    
    def weight1(arg1, arg2):
        weitht_prep(arg1)
        #rest of the func
    
    def weight2(arg1, arg2, arg3):
        weitht_prep(arg1)
        #rest of the func
    

    或者,您可以将公共部分移动到分派器中

        2
  •  2
  •   shybovycha    10 年前

    您也可以有一个带有可选第二个参数的函数:

    def function_1(x, y = None):
      if y != None:
        return x + y
      else:
        return x
    

    以下是示例运行:

    >>> function_1(3)
    3
    >>> function_1(3, 4)
    7
    

    甚至可选的多个参数!看看这个:

    def function_2(x, *args):
      return x + sum(args)
    

    示例运行:

    >>> function_2(3)
    3
    >>> function_2(3, 4)
    7
    >>> function_2(3, 4, 5, 6, 7)
    25
    

    您可以在此处参考 args 截至列表:

    def function_3(x, *args):
      if len(args) < 1:
        return x
      else:
        return x + sum(args)
    

    示例运行:

    >>> function_3(1,2,3,4,5)
    15