特别是“: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解释的那样,它只是元数据 - 没有我最初假设的执法?至少方法的消费者会清楚地看到我的意图。它是文档的替代品。认为这是好/坏/浪费时间?当然,良好的参数命名(与我的设计示例不同)通常会明确表示要传递的类型。
答案 0 :(得分:4)
它没有被用于任何东西 - 它只是用于实验(例如,你可以在python中读取它们)。它们被称为“功能注释”,并被描述为in pep 3107。
我编写了一个基于它的库,用于执行类型检查(以及更多 - 例如,您可以更轻松地从JSON映射到python对象),称为pytyp(more 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)