【问题标题】:Python: Checking parameter names against kwarg keysPython:根据 kwarg 键检查参数名称
【发布时间】:2023-03-17 05:58:02
【问题描述】:

抱歉这个幼稚的问题,但是在执行这段代码时:

def test_kwargs(n, **kwargs):  
    if kwargs is None:  
        print("no keyword args")  
        return  
    for key, value in kwargs.items():  
        print(str(key))  
        print(str(value))  
        if key==fn:
            print(value(10))  

test_kwargs(3,fn=lambda x: x^2)   

我在检查中遇到错误

if key==fn

NameError: name 'fn' is not defined

但是 print(str(key)) 正确输出了 'fn'。

那么这里发生了什么;为什么测试会失败?如何根据可能的参数名称检查密钥?

【问题讨论】:

  • **kwargs 成为字典。所以kwargs['fn'] 将包含你的 lambda 函数。
  • @TedKleinBergman 您可能已经注意到我已将 kwarg['fn'] 分配给 value 并且可以调用 lambda 函数;所以这不是问题。我想回答这个问题,即为什么平等测试失败而不是一些不相关的琐事。
  • 相等性测试失败,因为fn 不是您定义的。当您使用关键字参数调用您的函数时,它会被放入字典 kwargs 并且可以通过 kwargs['fn'] 访问。 IE。您必须像检查任何其他字典一样检查关键字是否存在于 kwargs 中。

标签: python keyword-argument


【解决方案1】:

kwargs 是一个字典,其中键是字符串,值是传入的值。您可以通过用于传递它的字符串键提取特定的 kwarg:

if "fn" in kwargs:
    fn = kwargs["fn"]

你也可以这样做:

fn = kwargs.get("fn")
if fn is not None:
    ... # do something with `fn`

【讨论】:

    【解决方案2】:

    key 是您传递的键名的字符串,因此您必须将其与另一个字符串进行比较。

    应该是:

    if key=="fn":
        print(value(10))
    

    【讨论】:

      【解决方案3】:

      args 和 kwargs 的类型

      如您所见,args 是一个元组kwargs 是一个字典

      def test_kwargs2(*args, **kwargs):
          print(type(args))
          print(type(kwargs))
      
      
      test_kwargs2(1, 2, 3, 4, a=1, b=2, c=3)
      

      输出

      <class 'tuple'>
      <class 'dict'>
      

      中可以使用Assignment expressions(the walrus operator)

      def test_kwargs(n, **kwargs):
          if func := kwargs.get('fn'): # like dict
              print(func(n))
      
      
      test_kwargs(3, fn=lambda x: x ^ 2)
      test_kwargs(3)
      

      输出:

      1
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-17
        • 1970-01-01
        • 1970-01-01
        • 2015-10-08
        • 1970-01-01
        相关资源
        最近更新 更多