提供详细信息:这是一个受限制的环境,包含Python 2.7.14,Pylint 1.8.1和Astroid 1.6.0以及其他各种模块,但我无法轻松安装新模块,例如{{1} (甚至不用virtualenv)或对代码库进行重大更改。
由于https://github.com/PyCQA/pylint/issues/400我在某些代码中遇到了pylint错误。我以一种hacky方式解决了这个问题(通过删除wait()方法的整数参数),现在我没有得到错误,但没有进行检查(pylint无法确定)什么类型的变量都是。)
我真正想做的是告诉pylint返回类型是什么。我已经尝试阅读Astroid文档,仔细阅读各种astroid / brains文件,并查看其他SO问题和答案,例如Set multiple inferred types based on arguments for pylint plugin和pylint, coroutines, decorators and type inferencing,但我想我不是在做了。我添加了自己的mypy
,我知道它在pylint期间被加载(因为它最初有语法错误:))。但我不确定它需要做什么。
假设我有这段代码:
load-plugins
在class Peer(object):
def get_domain(self):
return "foo"
class TestListener(object):
def __init__(self):
self._latest = None
def get(self, timeout):
# tricks here
return self._latest
def peer_joined(self, peer):
self._latest = peer
peer = TestListener().get(3)
print(peer.get_domain())
print(peer.get_foo())
期间,我们正在等待# tricks here
,在此期间另一个线程将调用threading.Event()
并传递peer_joined()
类型的对象,但是pylint不会grok this。
我想要做的是注释Peer()
方法告诉pylint它将返回一个TestListener.get()
对象,以便pylint在第二次打印调用中捕获错误。 / p>
我已经尝试了这一点,但很明显我错过了一些基本的东西,因为看起来我的变换方法甚至从未被调用过(如果我把伪造的方法调用那里没有打印错误):
Peer
答案 0 :(得分:0)
$url = Storage::url('/test/image.jpg');
这是一种用于编写python docstring的reStructuredText格式(一种在函数定义之后出现的多行字符串)。 您可以记录所有参数类型,以及函数返回的数据类型。
pylint可以解析该docstring以找出该函数返回值的数据类型。
此stackoverflow答案有更全面的解释 What is the standard Python docstring format?
答案 1 :(得分:0)
有一点需要提及的是,pylint目前的类型检查功能有限,如mypy中所见。它更依赖于推断没有类型提示的值和类型,尽管意图是在某些时候支持PEP-484打字。
现在关于这个问题,我看到你正在使用模块扩展器,而实际上你应该使用类转换,如:
astroid.MANAGER.register_transform(astroid.ClassDef, _class_transform,
optional_transform_predicate)