2016-04-21 173 views

回答

1

这是关系到Cannot find reference 'xxx' in __init__.py - Python/Pycharm和事实,即不存在__init__.py inside the boto.kinesis package中定义__all__

直接从boto.kinesis.layer1导入KinesisConnection使其为我工作:

import boto.kinesis 
from boto.kinesis.layer1 import KinesisConnection 

x = boto.kinesis.connect_to_region("us-west-2") 
assert isinstance(x, KinesisConnection) 

enter image description here


您也可以导入并添加type提示到的意见:

import boto.kinesis 
from boto.kinesis.layer1 import KinesisConnection 

x = boto.kinesis.connect_to_region("us-west-2") # type: KinesisConnection 

enter image description here

+0

这两个工作,谢谢。我正在使用JetBrains提交增强请求,以消除额外导入的需求。 –

+0

@MarkHarrison我怀疑他们会参考'boto.kinesis'包的结构/定义方式,因为'layer1'没有明确列在'__all__'里面,看起来与http://stackoverflow.com/questions/23248017/有关无法找到的参考-XXX-在-INIT-PY-蟒蛇,pycharm。 – alecxe

1

(PyCharm开发答复,通过JetBrains的支持)

作为@alexce注意到潜在的问题是PyCharm不能解决到boto.kinesis.layer1.KinesisConnectionboto.kinesis.layer1参考,因此符号不能太解决。

通常情况下,您不能通过这种方式引用软件包的子模块(不需要明确导入)。如果PyCharm允许它,当忘记添加必要的导入语句时,会出现大量的错误否定错误。但是由于这种情况非常普遍,我们通过boto/kinesis/__init__.py来查找一些迹象,表明sys.modules['boto.kinesis']可能已经包含属性​​。

任何以下的会做:

from boto.kinesis import layer1 
from . import layer1 
from boto.kinesis.layer1 import KinesisConnection 
import boto.kinesis.layer1 
'layer1' in __all__ 

事实上__init__.py确实包含这些import语句的三分之一,但在函数内部:

def regions(): 
    ... 
    from boto.kinesis.layer1 import KinesisConnection 
    ... 

因为我们不能保证静态那这个函数在运行时被调用,除了编辑器中未解决的引用之外,我们没有其他要做的事情。