Birden çok dönüş değeri türlerine nasıl açıklama eklenir?


107

IterableHer zaman iki değer veren bir işleve açıklama eklemek için tür ipuçlarını nasıl kullanabilirim : a boolve a str? İpucu Tuple[bool, str], dönüş değeri türünü bir oluşturucu veya başka bir yinelenebilir türle değil, bir demet ile sınırlaması dışında yakındır.

Çoğunlukla merak ediyorum çünkü aşağıdaki gibi foo()birden çok değer döndürmek için kullanılan bir işleve açıklama eklemek istiyorum:

always_a_bool, always_a_str = foo()

Genellikle (bir demet döndürür) foo()gibi bir şey yapmak gibi işlev görür return a, b, ancak tür ipucunun döndürülen demeti bir jeneratör veya liste veya başka bir şeyle değiştirecek kadar esnek olmasını isterim.



3
@ StevenM.Vascellaro Bu, bu sorunun bir kopyası değil
TWR Cole

Yanıtlar:


146

Her zaman bir nesneyi döndürüyorsunuz ; kullanmak return one, twobasitçe bir demet döndürür.

Yani evet, -> Tuple[bool, str]tamamen doğru.

SadeceTuple tip bir belirtmenizi sağlar sabit sayıda ayrı tip elemanların, her. İşleviniz sabit sayıda dönüş değeri üretiyorsa , özellikle bu değerler belirli, farklı türler olduğunda, gerçekten bir demet döndürüyor olmalısınız .

Diğer dizi tipleri için beklenen bir çok elemanların değişken sayıda türü belirtimi typing.Sequenceburada uygun değildir. Ayrıca listeler ve demetler arasındaki fark nedir?

Tuplelar heterojen veri yapılarıdır (yani girişleri farklı anlamlara sahiptir), listeler homojen dizilerdir. Tupleların yapısı vardır, listelerin düzeni vardır.

Python'un tip ipucu sistemi bu felsefeye bağlıdır, şu anda sabit uzunlukta yinelenebilir ve belirli konumlarda belirli türleri içeren bir sözdizimi yoktur.

Eğer varsa gereken herhangi iterable yapacak belirtmek, o zaman yapabileceğiniz en iyisi:

-> Iterable[Union[bool, str]]

bu noktada arayan kişi, herhangi bir sırada ve bilinmeyen uzunlukta (0 ile sonsuz arasında herhangi bir yerde) boole ve dizgeleri bekleyebilir .


2
Dil belirtimi diğer Iterables dönülür; foo()yapabilir yield True; yield "blah"ve a, b = foo()hala işe yarar. Veya foo()bir liste döndürebilir. Bir demet değil, keyfi yinelenebilir bir ipucu vermekle ilgilendiğimi netleştirmek için sorumu yeniden ifade ettim.
Richard Hansen

2
@RichardHansen: Ben ettik yeniden kontrol KEP'lerde belgelerine typingve mypymesaj beri başka 2 kez; Hiçbir şeyi kaçırmadığıma oldukça eminim. Bununla birlikte, burada, SO'da, yanlış olduğu ortaya çıkarsa beni düzeltmekten çekinmeyecek veya daha iyi bir cevap gönderecek bol miktarda Python tipi ipucu deneyimi olan birkaç düzenli kişi var.
Martijn Pieters

19
from typing import TupleTuple ek açıklamasının çalışması için eklemem gerekiyordu.
PHPirate

3
@PHPirate: evet ve aynısını Iterableve için yapmanız gerekir Union. Burada özel kullanımlarını tartıştığımız için, ithalat ima ediliyor.
Martijn Pieters

4
@MartijnPieters, harika bir yanıt için teşekkürler, ancak PHPirate'in yorumunun orijinal cevabınızda düzenlenmeye değer olduğunu düşünüyorum.
Tim Mironov
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.