2016-12-18 31 views
7

Komut dosyası için bazı temel statik denetime sahip olmak için Python 3.5'i Mypy ile birlikte kullanıyorum. Geçenlerde, OrderedDict 'i döndürmek için bazı yöntemleri yeniden düzenledim, ancak belirtilen Anahtar ve Değer türleriyle iade eki kullanmaya çalıştığımda "' type 'nesnesi abonelik olamaz" hatasıyla karşılaştı.Mypy tipi ek açıklama için OrderedDict K, V türlerini nasıl belirlerim?

İndirgenmiş örnek:

#!/usr/bin/env python3.5 

from collections import OrderedDict 

# this works 
def foo() -> OrderedDict: 
    result = OrderedDict() # type: OrderedDict[str, int] 
    result['foo'] = 123 
    return result 

# this doesn't 
def foo2() -> OrderedDict[str, int]: 
    result = OrderedDict() # type: OrderedDict[str, int] 
    result['foo'] = 123 
    return result 

print(foo()) 

Ve bu çalıştırıldığı piton çıktısı:

Traceback (most recent call last): 
    File "./foo.py", line 12, in <module> 
    def foo2() -> OrderedDict[str, int]: 
TypeError: 'type' object is not subscriptable 

Mypy Ancak açıklamada tür ek açıklaması bir problemi yok ve ben çalışırsanız aslında uyaracaktır result[123] = 123 yapmak.

Buna neden oluyor?

+1

(mypy versiyon 0.501). – max

cevap

5

Mypy'de sorun yoktur (en azından 0.501'de değil). Ancak, Python 3.6.0 ile ilgili bir sorun var. aşağıdaki düşünün:

from collections import OrderedDict 
from typing import Dict 

def foo() -> Dict[str, int]: 
    result: OrderedDict[str, int] = OrderedDict() 
    result['two'] = 2 
    return result 

Bu kod hem mypy (0.501) ve Python (3.6.0) tatmin edecektir. Ancak, Dict'u OrderedDict ile değiştirirseniz, mypy hala mutlu olacak, ancak yürütme işlemi TypeError: 'type' object is not subscriptable ile ölecektir.

Python yorumlayıcısının, işlev imzasında bir OrderedDict aboneliği görmeye başladığı, ancak değişken bir ek açıklamada kabul etmekten mutluluk duyması ilginçtir.

Bu nedenle, bunun için kullandığım geçici çözüm, fonksiyon imzasında OrderedDict yerine Dict kullanmaktır (ve Python yorumlayıcısı doğru imzayı kabul etmeyi öğrenirse bunun düzeltilmesi gerektiğini belirten bir açıklama ekleyin). Ayrıca MutableMapping kullanıyor deneyebilirsiniz Ne

+1

Evet, kendi kodumda aynı çözümü kullanarak sona erdim. – Xarn

1

(bu Yanıt gibi: https://stackoverflow.com/a/44167921/1386610) Artık çalışır

from collections import OrderedDict 
from typing import Dict 

def foo() -> MutableMapping[str, int]: 
    result = OrderedDict() # type: MutableMapping[str, int] 
    result['foo'] = 123 
    return result