【问题标题】:1 as parameter type in function declaration1 作为函数声明中的参数类型
【发布时间】:2018-06-02 00:48:33
【问题描述】:

如果你需要在 Python 中指定参数类型,在我的例子中是数组,你需要这样写:

def my_function(param: list):
    pass

在 Swift 中,您可以像这样指定参数类型:

func myFunction(param: [Any]) {
//
}

有一天我犯了 Swift 风格的错误并写道:

def my_function_2(param: []):
    pass

现在我注意到了,并尝试了一些更奇怪的东西:

def my_function_3(param: 1):
    pass

所有这些函数都是有效的,可以在 Python 3.6 中调用。具有预期参数类型的函数 one... 为什么会发生,为什么我没有看到任何警告以及我必须将哪种变量传递给函数 2 和 3 以满足我错误请求的参数类型?

【问题讨论】:

    标签: python python-3.x function types parameters


    【解决方案1】:

    注解对 Python 的编译器和解释器没有任何意义。1 只要您输入的是语法上有效的表达式,Python 就会计算它,将其值作为函数注解的一部分存储,然后离开它在那里让你做任何你想做的事(通常没什么)。

    事实上,您可以看到它的存储没有问题:

    >>> print(my_function_3.__annotations__)
    {'param': 1}
    

    注释的主要目的是使用静态类型检查器,如PEP 484 中所述(以及随附的PEP 483PEP 482 用于背景)。

    静态类型检查在 Python 中是可选的,通常使用mypy 等专用工具或PyCharm 等集成到 IDE 中的工具完成。

    如果您对您的代码运行这样的检查程序,它会报错。例如:

    $ mypy testscript.py
    testscript.py:1: error: invalid type comment or annotation
    

    这个错误意味着它无法确定1应该是什么类型。2


    最后一件事:

    我必须将什么样的变量传递给函数 2 和 3 以满足我错误请求的参数类型

    没有任何类型可以满足这一点。 Python 的运行时类型规则比它的(可选的)静态类型规则更灵活,但它们没有那么灵活。3


    1。但是,它们确实对 stdlib 中的至少一件事有意义,the dataclass decorator

    2。 Mypy 从这里继续,但没有更多错误,即使您滥用主体中的参数或不正确地调用函数。据我所知,它会跳过检查主体,并将函数视为接受任何参数并返回Any。这是相当合理的——这样你只会得到一个错误,而不是数百个可能没有任何意义的无用错误。

    3。你甚至无法测试它——isinstance(obj, 1) 将引发异常because 1 is not an instance of type。但是如果可以的话,它只能返回 true 如果 obj 是通过调用 1(或 1 的子类,其中没有)作为元类创建的,这是不可能的,或者如果 obj.__class__ 是设置为1(或子类),这是不可能的,或者如果int 有一个接受obj 的实例或子类挂钩,但它没有。但是——至少在 CPython 和 PyPy 中——它甚至不会走那么远。当然,你总是可以在 Python 之下,在 C API 之下,直接修改obj 下结构的ob_type 字段以指向1 对象,但如果你这样做,任何你尝试做的事情obj 只会出现段错误。

    【讨论】:

    • 您提到了 PyCharm - 我使用它。此功能(2 和 3)没有任何警告。
    • @StanislavChernischuk 我不使用它。我知道它声称有一个集成的静态类型检查器,但我不知道更多。
    • @StanislavChernischuk 通过快速搜索,我找到了this,但似乎更多的是使用 PyCharm 添加和管理类型提示,而不是使用它来检查它们。我对此无能为力(但如果您需要帮助将 mypy 添加到您的 emacs fly-check 中……)。
    • 无论如何,这对我来说是一个非常有用的参考。我也不知道mypy。这一切都会对我有很大帮助!
    猜你喜欢
    • 1970-01-01
    • 2019-02-26
    • 2012-02-16
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    相关资源
    最近更新 更多