【问题标题】:Using 'any' when defining a function定义函数时使用 'any'
【发布时间】:2021-08-31 08:39:18
【问题描述】:

我知道标题可能无法准确说明我的要求,所以这里有一小段代码应该解释一下:

def echo(msg: any) -> None:
    print(str(msg))

由于'any'是一个函数,我想问这样的语法是否正确。我知道我应该给出一个像'object'之类的类型,但我只想知道语法是否正确。

【问题讨论】:

  • 类型提示的语法是参数名,冒号,然后是类型。
  • 语法很好,但不推荐将函数注释用于除类型提示之外的任何内容。唯一的运行时要求是注解是一个有效的表达式(虽然我认为在 Python 3.10 中会放宽,当from __future__ import annotations 是默认值并且注解被简单地记录为字符串)。
  • 另外,不要将函数any 与类型提示typing.Any(表示任意类型)混淆。
  • 我不太确定问题是“我应该为any 写什么”而答案是typing.Any

标签: python function types any


【解决方案1】:

any 作为 Python 内置的 any 是一个函数。应该在注释中使用的Anytyping.Any - 这是一个注释标记,表示任何可能的对象。

通常:注释标记应使用直接的类或通过typing 库组成的其他专用对象。

【讨论】:

    【解决方案2】:

    我相信您打算将msg 设为任何类型。正确的代码是:

    from typing import Any
    
    def echo(msg: Any) -> None:
        print(str(msg))
    

    见:https://docs.python.org/3/library/typing.html#typing.Any

    一般来说,类型注释应该使用内置 typing 库中的类和对象,而不是像 any 这样的函数。

    【讨论】:

      【解决方案3】:

      语法真的很好。类型注释只希望您指定变量的类型或对象。所以在你的情况下,它是一个有效的语法,一切都会正常工作,因为any 也是对象。它只是一个内置函数。如果您通过解释器传递代码并检查注释,一切都会如预期的那样。

      >>> import typing
      >>>
      >>> def echo(msg: any) -> None:
      ...     print(str(msg))
      ...
      >>>
      >>> echo.__annotations__
      {'msg': <built-in function any>, 'return': None}
      >>>
      

      如您所料,这里msg 被假定为&lt;built-in function any&gt; 类型。

      但是,如果您使用诸如 mypy 之类的 Python 类型检查通过相同的方法,那么它会给您一个错误。所以它是一个有效的 Python 语法,但对 Python 类型检查器无效,因为它们不期望内置函数是有效类型。

      是的,即使您不打算问这个问题,正确的做法也是使用打字。任何类似:

      import typing
      
      def echo(msg: typing.Any) -> None:
          print(str(msg))
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 2022-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多