【问题标题】:Passing default parameters into nested functions python将默认参数传递给嵌套函数python
【发布时间】:2017-09-16 11:50:23
【问题描述】:

我有一个函数

foo(x, setting1=def1, settings2=def2)

(实际上这是一个第三方库函数,有一堆默认参数,我只需要在外部设置1个,但为了举例..)

我打电话给这个

bar(y, settings2_in=def2)
   x = get_x(y)
   foo(x, settings2=settings2_in)

这没关系,但从风格上讲,我宁愿将参数命名为settings2_insettings2。当我不断向下传递另一层时,我将不得不不断重命名参数,它变得丑陋。

bletch(z, settings2_in_2=def2)
   y = get_y(z)
   bar(y, settings2_in=settings_in_2)

是否有一种“不错的”/Pythonic 方式以这种方式将默认参数的子集向下传递到多层函数?

如果我这样做,Python 是否足够聪明以解决这个问题:

bar(y, settings2=def2)
   x = get_x(y)
   foo(x, settings2=settings2)

settings2 的两种用法与上下文不同?

【问题讨论】:

  • 我猜只是bar(y, **kwargs) 然后foo(x, **kwargs)
  • **kwargs 看起来不错。谢谢!

标签: python nested parameter-passing default


【解决方案1】:

您可以避免重新定义函数中的所有参数,只需使用**kwargs 捕获所有关键字参数。

然后将关键字参数传递给您的 foo 函数

def foo(x, setting1="def1", settings2="def2"):
    print(setting1,settings2)


def bar(y,**kwargs):
    foo(y,**kwargs)

bar(12)
bar(y=12)
bar(12,setting1="other")

结果:

def1 def2
def1 def2
other def2

请注意,由于ykwargs 之外,因此将y 作为关键字传递也可以。

唯一的缺点是您不知道实际可以传递给bar 的内容,但这是合乎逻辑的,因为它取决于foo 接受的内容。通过向您的函数添加一个文档字符串来弥补这一点。

【讨论】:

    【解决方案2】:

    直接回答您的问题:是的,Python 足够聪明,不会混淆同名的局部变量和出站函数参数。示例:

    def x(a):
        ...
    
    def y(a, b):
        return x(a=a)
    

    在返回行中,右侧的a 是传递给函数y 的参数的局部变量,左侧的a 是函数x 的参数。

    被调用函数的参数名称在被调用函数的参数列表的命名空间中,与调用上下文的局部变量和全局变量无关。

    【讨论】:

    • 太好了 - 我可能应该测试一下,但很高兴知道,谢谢
    • 我知道您是 StackOverflow 的新用户,提示一下 - 一旦您决定哪个答案对您最有帮助,请使用复选标记接受该答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多