web-dev-qa-db-ja.com

pycharm型チェッカーは型dictを期待し、代わりに「なし」を取得しました

このスニペットの内容:

_from typing import Dict, Optional 
class T:
    def __init__(self):
        self.bla = {}

    def t(self) -> Dict:
        if self.bla is None:
            self.bla = {'not none': 'nope!'}
        return self.bla
_

Intellij/pycharmのタイプチェッカーがこのメソッドの戻り値がNoneであると考える理由を誰かが説明できますか?

code snippet with error message

型チェッカーは、t()の戻り値の型に_Optional[Dict]_の注釈を付けた場合にのみ満足しているように見えますが、このメソッドはNoneを返すことはできないため、そうすべきではないと思います。オプション。

__init__()の_self.bla_の初期値を_{}_に変更しても、戻り値はNoneのままです。 strの代わりにdictを使用した場合も同じエラーが発生します

10
James Caccese

あなたが[〜#〜]できる[〜#〜]できること、しかしすべきではないことはこれです:

class T:
    def __init__(self):
        self.bla = {}

    def t(self) -> dict:
        if self.bla is None:
            result = {'not none': 'nope!'}
            self.bla = result
            return result
        else:
            return self.bla

このようにして、変数は個別に認識されます。ただし、この解決策はばかげていることに注意してください-あなたは私がPyCharmのバグと見なすものの回避策を実行しているだけです!実際、私は同じ問題を抱えていますが、それでも解決策はありません...

今のところ、警告を無視するか、PyCharmに警告を無視するように強制することをお勧めします:

# noinspection PyTypeChecker

私はどこかで、型ヒントがまだPyCharmに完全に実装されていないことを読んだので、それはまだ来るかもしれません...しかし、これをどこで読んだか覚えていないので、保証はありません!

3
Elias Mi

次の-> Dict or Noneアノテーションpycharm(2019.2)は文句を言わず、dictfdictnoneresタイプのオートコンプリートを取得します。

def fdictnone() -> Dict or None:
    return dict(a=1, b=2)


fdictnoneres = fdictnone()

TypeVarを使用する場合、pycharmはdicttfunresタイプのオートコンプリートを提供しません。

from typing import TypeVar


T = TypeVar('T', dict, None)


def tfun() -> T:
    return dict(a=1, b=2)


tfunres = tfun()
1
tshalif

インスタンス変数が機能することを示唆するTypeが見つかりました。また、2018プロバージョンのpycharmでは元の検査エラーが発生していないようですので、検査が少し賢くなるように更新されているのではないかと思います。

class T(object):
    def __init__(self):
        self.bla:Dict = None

    def t(self) -> Dict:
        if self.bla is None:
            self.bla = {'foo' : 'bar'}
        return self.bla
1
Marcel Wilson

コンストラクターでNoneとして初期化されているためだと確信しています。クラス定義で型を明示的に指定すれば、それは機能するはずです。例えば:

class T:
    bla: Dict

    def __init__(self):
        self.bla = None
0
4sfaloth