【问题标题】:What do double parentheses mean in a function call? e.g. func(foo)(bar)函数调用中的双括号是什么意思?例如函数(foo)(酒吧)
【发布时间】:2011-06-25 08:53:27
【问题描述】:

我一直使用这个习语在 Python 2 中以 utf-8 标准输出一堆内容:

sys.stdout = codecs.getwriter('utf-8')(sys.stdout)

但老实说,我不知道(sys.stdout) 在做什么。它让我想起了 Javascript 闭包之类的东西。但我不知道如何在 Python 文档中查找这个成语。

各位好心人能解释一下这里发生了什么吗?谢谢!

【问题讨论】:

    标签: python function-call


    【解决方案1】:

    .getwriter 返回一个 function 可调用对象;您只是在同一行中调用它。

    例子:

    def returnFunction():
        def myFunction():
            print('hello!')
        return myFunction
    

    演示:

    >>> returnFunction()()
    hello!
    

    您也可以这样做:

    >>> result = returnFunction()
    >>> result()
    hello!
    

    可视化:

    evaluation step 0: returnSomeFunction()()
    evaluation step 1: |<-somefunction>-->|()
    evaluation step 2: |<----result-------->|
    

    【讨论】:

    • 然而,在这个例子中,第二组括号是一个类实例化操作符,而不是一个函数调用。 (请参阅docs.python.org/tutorial/classes.html#class-objects)另外,请不要编辑问题以匹配您的答案。
    • @junjanes:感谢您指出这个细节(尽管“类实例化运算符”实际上只是类(可调用对象)或工厂函数(可调用对象))。您误解了编辑的理由:这不是为了让我的答案“更好地匹配”,而是为了更好地总结问题。 (顺便说一句,它实际上并没有使我的答案匹配得更好,而不是它使 your 答案匹配得更好。)鉴于您的担忧,我将在问题中重新添加原始标题。
    【解决方案2】:

    codecs.getwriter('utf-8') 返回一个具有StreamWriter 行为的类,其对象可以用流初始化。

    >>> codecs.getwriter('utf-8')
    <class encodings.utf_8.StreamWriter at 0x1004b28f0>
    

    因此,您正在做类似的事情:

    sys.stdout = StreamWriter(sys.stdout)
    

    【讨论】:

      【解决方案3】:

      用python灵活性的双括号调用包装函数。

      示例

      1- funcWrapper

      def funcwrapper(y):
          def abc(x):
              return x * y + 1
          return abc
      
      result = funcwrapper(3)(5)
      print(result)
      

      2- funcWrapper

      def xyz(z):
          return z + 1
      
      def funcwrapper(y):
          def abc(x):
              return x * y + 1
          return abc
      
      result = funcwrapper(3)(xyz(4))
      print(result)
      

      【讨论】:

        猜你喜欢
        • 2022-04-18
        • 1970-01-01
        • 2018-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-26
        相关资源
        最近更新 更多