“With” ifadesi tür ipucunu destekliyor mu?


16

withSözdizimi ile tanımlanan bir değişken için tür ipucunu tanımlayabilir misiniz ?

with example() as x:
    print(x)

Bunu söylemek için yukarıda ipucu tip istiyoruz xa, str(örneğin).

Bulduğum tek iş bir ara değişken kullanmaktır, ancak bu kibirli hissettirir.

with example() as x:
    y: str = x
    print(y)

Yazma belgelerinde bir örnek bulamıyorum .


6
Tip dama x, dönüş türü olarak türünü çıkaramaz example().__enter__()mı?
pschill

2
Neden xyalnızca dönüş türü olduğunda açıklama eklemek istersiniz example.__enter__? İdeal olarak, bu yönteme / işleve açıklama eklediniz.
a_guest

1
xdönüş değeri değil example; dönüş değeri example().__enter__().
chepner

Bulduğum çoğu yöntem, dönüş değeri için bir tür ipucu tanımlamaz.
Reactgular

1
@Reactgular Daha sonra çözüm, bu işlev için bir saplama dosyası oluşturmaktır , böylece tür denetleyicisi türü çıkarabilir. Genellikle API sınırlarına açıklama eklersiniz, içeride değil. Bu durumda türün geldiği açıktır example. Ek açıklama example.__enter__, bir ek açıklama anlamına gelirken, yaklaşımınızla bu bağlam yöneticisinin kullanıldığı tüm yerlere ek açıklama eklemeniz gerekir , ayrıca genel olarak bir kullanıcının sağlanmadığı takdirde bir API'nın dönüş türünün nasıl olduğunu nasıl bilmesi gerekir?
a_guest

Yanıtlar:


11

Python 3.6'da uygulanan PEP 526, değişkenlere açıklama eklemenizi sağlar. Örneğin,

x: str
with example() as x:
    [...]

veya

with example() as x:
    x: str
    [...]

Bu aynı zamanda diğer kod blokları için de geçerlidir for. Harika cevap, teşekkür ederim.
Reactgular

Bağlam yöneticisi __enter__yöntemin neyi döndüreceğini ima xetmezse , yazmanın herhangi bir amacı yoktur. mypyherhangi bir tür değerin bağlanmasına izin verir x.
chepner

@ chepner Evet haklısın. PyCharm her iki durumda xolduğu gibi tanır str, ancak mypytanımaz.
pschill

14

Genellikle tip ek açıklamaları API sınırlarına yerleştirilir. Bu durumda, türden çıkarılmalıdır example.__enter__. Bu işlevin herhangi bir tür bildirmemesi durumunda çözüm, tür denetleyicisinin bu türü çıkarmasına yardımcı olmak için karşılık gelen bir saplama dosyası oluşturmaktır .

Özellikle bu , içe aktarılan .pyimodülle aynı gövdeye sahip bir dosya oluşturmak anlamına gelir Example. Sonra aşağıdaki kod eklenebilir:

class Example:
    def __enter__(self) -> str: ...
    def __exit__(self, exc_type, exc_value, exc_traceback) -> None: ...
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.