2016-04-21 5 views
1

Как заставить PyCharm понимать завершение для возвращаемой переменной?PyCharm: указать тип возвращаемой переменной?

По https://www.jetbrains.com/help/pycharm/5.0/type-hinting-in-pycharm.html

Я утверждающий тип переменной, но не получают каких-либо доработок.

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

foo = x. <--- not getting completions here 

enter image description here

Python 2,7, PyCharm Community Edition 2016.1.2

ответ

1

Это связано с Cannot find reference 'xxx' in __init__.py - Python/Pycharm и тот факт, что не существует __all__ определена внутри __init__.py inside the boto.kinesis package.

Импорт KinesisConnection непосредственно из boto.kinesis.layer1 сделал это работает для меня:

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/ не может-найти-справочно-ххх-в-Init-ру-питон-PyCharm. – alecxe

1

(ответов разработчиков PyCharm, через поддержку JetBrains)

Как отмечено @alexce основная проблема заключается в том, что PyCharm не решает boto.kinesis.layer1 ссылки и, следовательно, символов, чтобы boto.kinesis.layer1.KinesisConnection не может быть решена тоже.

Обычно вы не можете обращаться к подмодулям пакета таким образом (без их импорта явно). Если бы PyCharm разрешил это, было бы много ложных отрицательных ошибок, если вы забудете добавить необходимую импорту. Но поскольку подобные ситуации довольно распространены, мы просматриваем boto/kinesis/__init__.py, пытаясь найти некоторые признаки того, что sys.modules['boto.kinesis'] может уже содержать атрибут layer1.

Все из перечисленного лучше сделать:

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

На самом деле __init__.py действительно содержит треть этих операторов импорта, но внутри функции:

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

Поскольку мы не можем гарантировать, что статически эта функция вызывается во время выполнения, нам больше нечего делать, кроме предупреждения о неразрешенной ссылке в редакторе.