gue*_*tli 1 python django type-hinting python-3.x
我想使用注释在IDE中有更好的自动完成,并且可能稍后在自动化测试中进行类型测试.但是如何在不引入大量额外代码的情况下为多种方法添加类型注释?
例如,假设您有一个使用Django框架的大代码库,包括大约200个带request参数的方法; 添加类型注释200次会使代码膨胀.
我目前的想法是在包级别包含类型注释:in setup.py(或其他地方).我定义了一个规则,说"每次使用变量request时,它都是类型django.http.HttpRequest".对于名称request指向不同类型的变量的边缘情况,应该进行显式注释,但这些注释很少.
如何实施?还有其他方法可以实现总体目标吗?
如果我的理解是正确的,这听起来像存根文件的用例,如下所述PEP 484:
存根文件是包含类型提示的文件,仅供类型检查程序使用,而不是在运行时使用.
存根文件几乎满足了将代码与类型注释分离的要求,从而避免了复杂类型提示的膨胀和混淆效果.它们的前缀为.pyi,如果类型检查器由IDE想要符合的类型检查器实现PEP 484,则必须始终由类型检查器检查它们是否存在.
它们基本上由带注释的函数签名组成,其中包含一个包含单个省略号的主体 ...
你可以解决这个问题的一种方法是使用帮助函数来写出你的.pyi,或者至少是它的大部分内容.可能有很多方法可以做到这一点,哪个是最好的可能是另一个问题.
作为一种方法的一个例子,我将写出一种方法来注释inspect模块中具有参数命名object并且不以下划线开头的每个函数.我正在键入这个特定的模块,因为我也将它用于识别功能和抓取他们的签名.
从inspect模块,我将使用getmembers,isfunction和signature功能.
# gets members of inspect module {member_name: member_type} dict.
members = getmembers(inspect)
# loop through members
for name, type in members:
# grab functions that don't start with an underscore
if isfunction(type) and not name.startswith('_'):
# grab its signature and
# check if it has a parameter named object
sig = signature(type)
if 'object' in sig.parameters:
# add the annotation to the object parameter
param = sig.parameter['object']
s = sig.replace(parameters = [param.replace(annotation="object")])
# here you normally write to .pyi file
print('def {0} {1}: ...'.format(name, s))
Run Code Online (Sandbox Code Playgroud)
该逻辑可以扩展为methods,其他参数类型等.另外,一个重要的注意事项,该.pyi文件应该与您正在注释的模块具有相同的名称,因此在这种情况下它应该是inspect.pyi.
现在,这只是打印出所有具有以我们提供object的'annotation'(object)命名的参数的函数:
def findsource(object:'object'): ...
def formatannotationrelativeto(object:'object'): ...
def getabsfile(object:'object'): ...
def getcomments(object:'object'): ...
def getdoc(object:'object'): ...
def getfile(object:'object'): ...
def getmembers(object:'object'): ...
def getmodule(object:'object'): ...
def getsource(object:'object'): ...
# .. and so on..
Run Code Online (Sandbox Code Playgroud)
大多数生产就绪检查器将读取此.pyi文件并提供您需要的功能.
| 归档时间: |
|
| 查看次数: |
157 次 |
| 最近记录: |