代码之家  ›  专栏  ›  技术社区  ›  Rodolphe LAMPE

仅在需要时传递参数

  •  0
  • Rodolphe LAMPE  · 技术社区  · 6 年前

    作为一个例子,我有一个函数 f 和一个变量 a=1 . 有时 f 需要 a 我想打电话 f(a=a) 以及其他时间 f 没有参数。我该怎么处理?

    当我试着打电话的时候 f(a= a) (希望它会悄悄地忽略 不用于 f ,我得到以下类型错误:

    f got an unexpected keyword argument 'a'
    

    编辑

    我想实现一个函数 g 这样,考虑到:

    def f1(a):
        return a
    
    def f2():
        return 1
    

    我们有:

    g(f1, a) == a
    g(f2, a) == 1
    
    3 回复  |  直到 6 年前
        1
  •  2
  •   nosklo    6 年前

    您似乎想要检查函数的参数。

    为此,请使用 inspect 模块:

    import inspect
    def g(somefunc, *params):
        num_args = len(inspect.getargspec(somefunc).args)
        return somefunc(*params[:num_args])
    

    使用您的功能进行测试:

    def f1(a):
        return a
    
    def f2():
        return 1
    
    >>> print(g(f1, 3))
    3
    >>> print(g(f2, 3))
    1
    
        2
  •  2
  •   Jean-François Fabre    6 年前

    在中使用关键字词典 f :

    def f(**kwargs):
        if 'a' in kwargs:
            print("a passed with value {}".format(kwargs['a']))
        else:
            print('a not passed')
    
    f(a=12)
    f()
    

    印刷品:

    a passed with value 12
    a not passed
    

    它使参数测试/检索完全手动。你可以做任何你想做的事情,它可以被概括为几个参数。

    这还禁止将参数作为类似位置的 f(12) 这对你来说可能是件好事。

    >>> f(12)
    Traceback (most recent call last):
    TypeError: f() takes 0 positional arguments but 1 was given
    

    缺点是调用方不能依赖参数名来知道要传递什么。要么创建一个docstring,要么人们必须阅读代码/猜测…

    现在要将其应用到您的编辑中,我必须说哪种方式会改变问题。所以 f2 无法更改,在该CA中,必须在包装函数中完成工作:

    def f1(a):
        return a
    def f2():
        return 1
    
    def g(f,arg):
        try:
            return f(a=arg)
        except TypeError:
            return f()
    
    a=12
    print(g(f1, a))
    print(g(f2, a))
    

    印刷品:

    12
    1
    

    所以“最好请求宽恕而不是允许”:如果我们得到 TypeError (当函数不知道参数时引发),我们只调用函数 没有 参数。如果第一个函数返回 类型错误 ,我们不知道它是参数还是函数内部。

    解决方法是检查错误消息,如果错误消息是关于参数的,则只调用不带参数的函数:

    def g(f,arg):
        try:
            return f(a=arg)
        except TypeError as e:
            if "unexpected keyword" in str(e):
                return f()
            else:
                raise e  # another TypeError, let it pass
    
        3
  •  -1
  •   Jack Walsh    6 年前

    只需在函数中指定默认参数 def 行…

    def f(a=1):
        return(a)
    print(f()) #returns 1
    print(f(a = 2)) #returns 2
    

    下一部分(你似乎用编辑来交换你的问题…

    def g(f, a):
        return(f(a))