【问题标题】:Passing expression as argument: keyword can't be an expression将表达式作为参数传递:关键字不能是表达式
【发布时间】:2012-05-19 07:17:45
【问题描述】:

这是我的行动:

>>> def show(d):
        print d
... 
>>> test = {"result": True}
>>> show(test)
{'result': True}
>>> show(test["info"]="Some info")
  File "<console>", line 1
SyntaxError: keyword can't be an expression

为什么我不能将表达式作为参数传递给函数?

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    因为通常它没有意义。你想从中得到什么?赋值不返回值。

    让我们考虑几种可能性:

    • 表达式应作为函数传递 - 您应使用 lambda,或创建一个实际函数。
    • 表达式应该返回一个布尔值以表示成功 - Python 会在失败时引发异常,而是检查这些异常。
    • 表达式应该给出None - 这没有任何价值。

    无论哪种方式,您尝试做的事情都没有意义。

    【讨论】:

    • 是的,这是我的遗漏——我忘记了赋值不会返回值
    【解决方案2】:

    = 符号向 Python 表明这是一个关键字参数,而不是位置参数。由于= 左侧的部分是表达式test["info"],因此您会收到错误消息。

    【讨论】:

    • 这是对他收到的错误的一个很好的解释,但并不是手头问题的真正答案。
    • @Lattyware,这部分已经被其他人充分回答了。 (糟糕,是你!)
    【解决方案3】:

    不允许在 Python 表达式中赋值的原因是其他语言中常见的、难以发现的错误,由这种结构引起:

    if (x = 0) {
        // error handling
    }
    else {
        // code that only works for nonzero x
    }
    

    来源:http://docs.python.org/faq/design.html#why-can-t-i-use-an-assignment-in-an-expression

    【讨论】:

      【解决方案4】:

      我认为您想要做的是将它作为 glob 类型传递。

      show(*test)  
      

      这样做你必须匹配你的 arg 签名,所以 test 必须被定义为

      test = {'d' : True}
      

      否则节目必须是

      def show(result): 
      

      【讨论】:

        猜你喜欢
        • 2015-06-09
        • 1970-01-01
        • 2013-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-07
        相关资源
        最近更新 更多