2016-04-21 95 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 
    ... 

因爲我們不能保證靜態那這個函數在運行時被調用,除了編輯器中未解決的引用之外,我們沒有其他要做的事情。