我已经阅读了PEP 3107的前几节,但是我仍然没有得到他们对这种语言所做的任何贡献。在我看来,您可以使用装饰器将元数据添加到函数中。例如
def returns(return_type):
f.return_type = return_type # <- adding metadata here
return f
@returns(Foo)
def make_foo(): ...
您也可以将元数据添加到参数中,如果您利用默认参数,它会看起来很漂亮,如下所示:
import inspect
def defaults_are_actually_metadata(f):
names, args_name, kwargs_name, defaults = inspect.getfuncspec(f)
f.parameter_metadata = dict(zip(names[-len(defaults):], defaults))
f.__defaults__ = ()
return f
@defaults_are_actually_metadata
def haul(load="Stuff to be carried.",
speed_mph="How fast to move the load (in miles per hour)."): ...
至少我最初的印象是注释是多余的:装饰器可以做注释可以(甚至更多)可以做的所有事情。在向功能添加元数据时,为什么注释比装饰器更好?
正如您所提到的,相关的PEP是3107(如果遇到其他问题的人尚未阅读,请链接以方便参考)。
目前,注释是一种实验,正在进行中。实际上,有关该主题的python-
ideas邮件列表中
最近有一个主题,可能会有所帮助。(提供的链接仅用于每月存档;我发现特定帖子的URL倾向于定期更改。所讨论的线程在12月初附近,标题为“函数注释的[Python-
ideas]约定”。)第一篇文章来自12月1日的Thomas Kluyver。)
以下是Guido van Rossum在该主题中发表的一篇文章:
在2012年12月4日上午11:43,贾斯珀·圣·皮埃尔(Jasper St.
确实。我以前看过注解,但是我从不理解目的。这似乎是一项html" target="_blank">设计和实现的功能,没有考虑到任何目标,而且社区应该自行发现目标。
Guido的回应:
相反的。有太多用例立即显得很重要,而我们无法弄清哪个用例最重要或如何将它们组合在一起,因此我们决定采用两步法:在步骤1中,我们设计了语法,而在步骤2中,我们将设计语义。这个想法非常明确,一旦确定了语法,人们将可以自由地尝试不同的语义-
只是不在stdlib中。想法也是最终,从所有这些实验中,将出现一个适合于stdlib的实验。
贾斯珀·圣皮埃尔:
因此,如果我要问的话,注释的最初目标是什么?PEP提供了一些建议,但没有任何具体说明。它是否旨在辅助IDE或检查源代码的静态分析工具?应用程序本身需要通过某些方式来提供特殊行为,例如命令行解析器或运行时静态检查器吗?
Guido的回应:
几乎在某种程度上,以上所有方面。但对我个人而言,主要目标始终是得出一种符号,以指定参数约束和返回值的类型约束(可能还有其他约束)。我在各个时间都在用特定的组合类型方式戏弄。例如list
[int]可能表示整数列表,而dict [str,tuple
[float,float,float,bool]]可能意味着将字符串映射到三个浮点数和bool的元组的dict。但是我觉得,就这样一种符号达成共识要比对参数注释的语法要困难得多(想想您可以对这两个示例提出多少反对意见:-)-我一直强烈希望使用“
var:type = default”,并使类型成为要与默认值同时求值的运行时表达式。
和Ned Batchelder的一点幽默:
对我来说,一个很有意义的时刻是在PyCon上的Py3k早期主题演讲期间(也许是在达拉斯或芝加哥?),Guido记不清“
annotation”一词,并说:“您知道,那些不是类型声明的东西?:-)
问题内容: 好的,我知道三引号字符串可以用作多行注释。例如, 和 但是从技术上讲,这些是字符串,对吗? 我已经在Google上搜索并阅读了Python样式指南,但无法找到关于为什么没有正式实现多行,/ * * /注释类型的技术答案。我使用三重引号没有问题,但是对于导致这个设计决定的原因我有点好奇。 问题答案: 我怀疑您会得到比“ Guido不需要多行注释”更好的答案。 Guido在推特上发布了以下
我刚刚发现了Python3的函数注释(https://www.python.org/dev/peps/pep-3107/)这对于记录参数或返回类型似乎很有用。它还可以在我的pycharm IDE中提供更好的intellisense。 我有一个关于输入类型模糊的参数的问题。例如,它可以是一个列表或numpy数组或一些“类似数组”的数量。为函数注释此类输入参数的最佳方法是什么?例子: 我还有一个例子,
函数注释似乎重复了Python中已经发现的行为。不仅如此,它们的含义没有以任何方式强制执行,因此它们可以用于PEP 3107中记录的以下任何一项: 提供打字信息 类型检查 让IDE显示函数期望和返回的类型 函数重载/泛型函数 外语桥梁 改编 谓词逻辑函数 数据库查询映射 RPC参数封送 其他信息 参数和返回值的文档 甚至是完全不同的东西。 在某种程度上,函数注释让我想起Python幽默系列中的一个
问题内容: 我大致了解这种构造的作用:它创建了SomeType EJB,并将对象注入到另一个EJB中。 现在,我有一个以这样的方式开始的类:(尽管我认为只有的相关,我会给出所有类级别的注释) 什么的就做吗?他们可能会从JNDI获取或创建“ name1” …对象,但是将结果放在哪里?我看不到附近有任何电话,但是代码库很大,所以我对此不太确定。 额外的问题:我想这两个注释只是重复默认值? 更新:目前有
问题内容: 嵌入式注释如何影响数据库? SQL查询将如何改变? 使用注释的典型用例是什么? 问题答案: 嵌入式注释如何影响数据库? 它根本不影响它。在ORM提供程序层上,来自嵌入式实体的所有字段都 将 与父实体 合并 ,并像对待它们始终在其中声明一样。换句话说,它的工作方式就好像您将所有字段,获取器和设置器直接复制到包含嵌入式对象的实体中一样。 SQL查询将如何改变? 他们不会。您无需更改任何内容
那么在这里@OrderColiv(name="order_id")有什么用呢? 那么在这里@OrderColiv(name="order_id")有什么用呢?
问题内容: 在Jackson中,当您使用注释构造函数时,必须使用注释其参数。所以这个构造函数 变成这个: 我不明白为什么有必要。你能解释一下吗? 问题答案: Jackson必须知道以什么顺序将字段从JSON对象传递给构造函数。使用反射无法在Java中访问参数名称-这就是为什么您必须在注释中重复此信息的原因。