【问题标题】:How to access kwargs created in an other function using python?如何使用 python 访问在其他函数中创建的 kwargs?
【发布时间】:2015-06-25 14:38:44
【问题描述】:

我正在编写具有很多功能的大型有限元分析代码。为了在不同的函数之间传递变量,我使用了 python 的 kwargs。我主要选择了这个,以便我可以以多种不同的方式调用函数,从而创造出极大的灵活性。

但是现在我正在处理一个问题。从一个主函数中,我使用 kwargs 调用另一个函数。然后,第二个函数处理输入并添加新的 kwargs。问题是在该函数中创建的新 kwargs 在第一个函数中是不可访问的。有没有这样做的pythonic方式?我创建了以下代码作为示例:

# Create main function
def main(**kwargs):
    # Add a key word argument
    kwargs["textMain"] = "text added in main"

    # Call a function with existing kwargs and a new one
    functionA(textNew = "text added in new" ,**kwargs)

    # Test what is in kwargs after subfunction is called
    print("\nTest kwargs after subfunction is called:")

    if "textMain" in kwargs:
        print(kwargs["textMain"])

    if "textNew" in kwargs:
        print(kwargs["textNew"])

    if "textA" in kwargs:
        print(kwargs["textA"])

def functionA(**kwargs):

    # Test kwargs before adding kwargs in subfunction
    print("\nTest kwargs in subfunction before adding:")

    if "textMain" in kwargs:
        print(kwargs["textMain"])

    if "textNew" in kwargs:
        print(kwargs["textNew"])

    if "textA" in kwargs:
        print(kwargs["textA"])

    # Add kwargs
    kwargs["textA"] = "text added in sub A"

    # and test kwargs again
    print("\nTest kwargs in subfunction after adding:")
    if "textMain" in kwargs:
        print(kwargs["textMain"])

    if "textNew" in kwargs:
        print(kwargs["textNew"])

    if "textA" in kwargs:
        print(kwargs["textA"])

if __name__ == "__main__":
    main()

这会产生以下输出:

#Test kwargs in subfunction before adding:
#text added in main
#text added in new

#Test kwargs in subfunction after adding:
#text added in main
#text added in new
#text added in sub A

#Test kwargs after subfunction is called:
#text added in main

我最喜欢的输出是:

#Test kwargs in subfunction before adding:
#text added in main
#text added in new

#Test kwargs in subfunction after adding:
#text added in main
#text added in new
#text added in sub A

#Test kwargs after subfunction is called:
#text added in main
#text added in new
#text added in sub A

如果有人能解决我的问题,那将是非常有帮助的。提前致谢!

【问题讨论】:

  • 你的例子感觉有点臃肿,你确定不能再短一点吗?

标签: python function python-3.x keyword-argument


【解决方案1】:

当您在调用表达式中使用**kwargs 语法时,Python 会扩展字典并传入单独的参数。然后,函数签名中的相同语法告诉 Python 在该函数中创建一个 new 字典以捕获关键字参数。

换句话说,main() 中的kwargsfunctionA() 中的字典不同。

要么传入实际字典(不使用**kwargs 语法),要么让functionA() 返回一个字典。

kwargs 作为单个参数传入可以让您从functionA() 更改字典并查看main() 中反映的更改,因为它们现在共享对同一字典的引用:

def main(**kwargs):
    functionA(kwargs, textNew="text added in new")
    # ... etc ...


def functionA(mapping, **kwargs):
    # do something with mapping, it is the same dictionary as kwargs in main

functionA() 返回更新后的kwargs 字典需要您将新对象分配回main() 中的kwargs

def main(**kwargs):
    kwargs = functionA(textNew="text added in new", **kwargs)
    # ... etc ...

def functionA(**kwargs):
    # ...
    return kwargs

【讨论】:

  • 但是返回 kwargs 不是一项昂贵的操作吗?我们是否通过这种方式返回 kwargs 来创建一个新字典?返回对原始字典的引用会更好,但我希望能够添加键值参数,而不仅仅是对它的简单引用。
  • @JanWillemFeitsma:不,返回kwargs 并不昂贵。当您调用该函数时,Python 已经创建了字典(并且创建它确实相对便宜)。否则,Python 函数总是返回一些东西(默认返回值是None)。这取决于您的用例,哪个更好;对于此处的示例,传入引用并进行修改肯定更容易。
猜你喜欢
  • 1970-01-01
  • 2022-07-24
  • 2012-11-02
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 2019-12-18
  • 2020-05-11
相关资源
最近更新 更多