def some_method(param:int)语法有什么意义?

时间:2012-03-06 00:39:29

标签: python parameters

特别是“:int”部分......

我假设它在调用函数时以某种方式检查了参数的类型,并且在违规的情况下可能引发异常。但是以下运行没有问题:

def some_method(param:str):
    print("blah")

some_method(1)

def some_method(param:int):
    print("blah")

some_method("asdfaslkj")

在这两种情况下都会打印出“blah” - 没有例外。

我不确定该功能的名称是什么,所以我不确定要google什么。

编辑:好的,所以它是http://www.python.org/dev/peps/pep-3107/。我可以看到它在利用元数据的框架中是如何有用的。这不是我想象的那样。感谢您的回复!

后续问题 - 如果我真的只能处理int输入,那么将我的函数定义为def some_method(param:int)是否是一个好主意或坏主意的任何想法 - 即使如pep 3107解释的那样,它只是元数据 - 没有我最初假设的执法?至少方法的消费者会清楚地看到我的意图。它是文档的替代品。认为这是好/坏/浪费时间?当然,良好的参数命名(与我的设计示例不同)通常会明确表示要传递的类型。

5 个答案:

答案 0 :(得分:4)

它没有被用于任何东西 - 它只是用于实验(例如,你可以在python中读取它们)。它们被称为“功能注释”,并被描述为in pep 3107

我编写了一个基于它的库,用于执行类型检查(以及更多 - 例如,您可以更轻松地从JSON映射到python对象),称为pytypmore info),但它是不太受欢迎...(我还应该补充一点,pytyp的类型检查部分根本没有效率 - 它可以用于追踪错误,但你不想在整个程序中使用它。)< / p>

[更新:我不建议一般使用功能注释(即没有特别使用,就像文档一样),因为(1)它们最终可能以你没想到的方式使用,(2)事物的确切类型在python中通常并不重要(更确切地说,并不总是很清楚如何以有用的方式指定某事物的类型 - 对象可能非常复杂,并且通常只有“部分”被任何一个使用函数,多个类以不同的方式实现这些部分......)。这是duck typing的结果 - 请参阅有关如何使用python的抽象基类来解决此问题的相关讨论的“更多信息”链接...]

答案 1 :(得分:3)

功能注释就是你对它们所做的。

它们可用于文档:

def kinetic_energy(mass: 'in kilograms', velocity: 'in meters per second'):
     ...

它们可用于前置条件检查:

def validate(func, locals):
    for var, test in func.__annotations__.items():
        value = locals[var]
        msg = 'Var: {0}\tValue: {1}\tTest: {2.__name__}'.format(var, value, test)
        assert test(value), msg


def is_int(x):
    return isinstance(x, int)

def between(lo, hi):
    def _between(x):
            return lo <= x <= hi
    return _between

def f(x: between(3, 10), y: is_int):
    validate(f, locals())
    print(x, y)


>>> f(0, 31.1)
Traceback (most recent call last):
   ... 
AssertionError: Var: y  Value: 31.1 Test: is_int

另请参阅http://www.python.org/dev/peps/pep-0362/了解实现类型检查的方法。

答案 2 :(得分:1)

在python中没有经验,但我认为重点是注释/声明方法期望的参数类型。是否在运行时严格执行预期类型是不重要的。

例如,考虑:

intToHexString(param:int)

尽管语言在技术上可能允许您调用intToHexString("Hello"),但这样做并没有语义意义。将:int作为方法声明的一部分有助于强化它。

答案 3 :(得分:1)

它基本上只用于文档。当一些人检查方法签名时,他们会看到param被标记为int,这将告诉他们该方法的作者希望他们传递int

因为Python程序员使用duck typing,这并不意味着你来传递int,但它告诉你代码期待“int-like”。所以你可能不得不传递基本上“数字”的东西,它支持算术运算。根据方法,它可能必须可用作索引,或者可能不能。

但是,因为它的语法而不仅仅是注释,所以注释对任何想要内省它的代码都是可见的 。这开启了编写typecheck装饰器的可能性,该装饰器可以对任意函数强制执行严格的类型检查;这允许您将类型检查逻辑放在一个位置,并让每个方法声明哪些参数需要严格按类型检查(通过附加类型注释),并使用最少的语法,以便浏览的客户端程序员可以看到找出界面的方法定义。

或者您可以使用这些注释做其他事情。尚未形成标准化的含义。 也许如果某人想出了一个使用它们且具有巨大采用率的杀手级功能,那么它有一天会成为Python语言的一部分,但我怀疑使用它们的灵活性如果你想要的话会是太有用了。

答案 4 :(得分:1)

您也可以使用&#34; - &gt;的returnValue&#34;用于表示函数可能返回的类型的符号。

def mul(a:int, b:int) -> None:
    print(a*b)