Python geçersiz dönüş türü ek açıklaması


117

Python 3.x'te, bir işlevin dönüş türü ek açıklamasını kullanmak yaygındır, örneğin:

def foo() -> str:
    return "bar"

"Boşluk" türü için doğru ek açıklama nedir?

3 seçenek düşünüyorum:

  1. def foo() -> None:
    • mantıksal IMO değil, çünkü Nonebir tür değil
  2. def foo() -> type(None):
    • elde etmek için bildiğim en iyi sözdizimini kullanarak NoneType,
  3. def foo():
    • açık dönüş türü bilgilerini atlayın.

Seçenek 2, bana en mantıklı geliyor, ancak 1'in bazı örneklerini zaten gördüm.


12
FWIW, Python'un voiddönüş türüne sahip işlevleri yoktur . Açıkça belirtilmemiş herhangi bir işlev (veya bir işlevdeki dal) returngeri dönecektir None. OP'nin bu yorumun çoğunlukla gelecekteki okuyucuların yararına olduğunu anladığını varsayıyorum ...
PM 2Ring

Pekala, bu soru "neden benim fonksiyonum Python'da Hiçbiri döndürüyor?" Kadar popüler değil. (Bu soruyu ben uydurdum), bu yüzden muhtemelen çoğu okuyucu varsayılan davranışı zaten biliyor. Cevapta 1'e 2 ikilemi çözüldü. Peki ya 3? "Prosedürler" için aslında işe yaramaz dağınıklık olmadan 3. seçeneği tercih ederim (sonuçta, bu işlev hiçbir şey döndürmez).
Tomasz Gandor

@TomaszGandor Kabul ediyorum. Bir işlev veya yöntem hiçbir dönüş ifadesi içermediğinde, dönüş türünü belirtmeye gerek yoktur.
Jeyekomon

Yanıtlar:


128

Bu, doğrudan PEP 484 - Tip İpuçları belgelerinden alınmıştır:

Bir tür ipucunda kullanıldığında, ifade Noneile eşdeğer kabul edilir type(None).

Ve gördüğünüz gibi çoğu örnek Nonedönüş türü olarak kullanılıyor.


22
Açıklığa kavuşturmak için yukarıdaki 1. seçeneği seçin.
Adam Nelson


13
@asmaier göre bu soruya değinir PEP 484 - Tip İpuçları NoReturn tipi kullanılan "... Annotatesekmesindeki işlevlerine normalde asla geri Örneğin, bir işlev kayıtsız şartsız ... bir özel durum olduğunu"
Rodrigo Laguna

40

TLDR: Bir voiddönüş türü ek açıklamasının deyimsel karşılığı şudur -> None.

def foo() -> None:
    ...

Bu return, çıplak veya çıplak bir işlevin returndeğerlendirdiği ile eşleşir None.

def void_func():  # unannotated void function
    pass

print(void())  # None

Dönüş türünün atlanması, dönüş değerinin olmadığı anlamına gelmez. Başı olarak PEP 484 :

Kontrol edilen bir işlev için, bağımsız değişkenler ve dönüş türü için varsayılan açıklama Any.

Bu, değerin dinamik olarak yazılmış olduğu ve herhangi bir işlemi statik olarak desteklediği anlamına gelir . Bu neredeyse tam tersi anlamıdır void.


Python'da tip ipucu, kesinlikle gerçek türleri gerektirmez. Örneğin, ek açıklamalar tipi isimlerinin dizeleri kullanabilir Union[str, int], Union[str, 'int'], 'Union[str, int]'ve çeşitli varyantlar eşdeğerdir.

Benzer şekilde, tür ek açıklamasının "eşittir " anlamına geldiğiNone kabul edilirNoneType . Bu, yalnızca dönüş türleri için kullanılamaz, ancak en sık orada göreceksiniz:

bar : None

def foo(baz: None) -> None:
    return None

Bu aynı zamanda genel türler için de geçerlidir. Örneğin, bir oluşturucunun değerleri almadığını veya döndürmediğini belirtmek için Nonein kullanabilirsiniz Generator[int, None, None].


PEP 484 düşündürmektedir rağmen Nonearaçlar type(None), sen olmamalı açıkça ikincisi formu kullanın. Türü ipucu özellikleri yok olup herhangi bir şekilde bulunmaktadır type(...). Bu teknik olarak bir çalışma zamanı ifadesidir ve desteği tamamen tür denetleyicisine bağlıdır. mypyProje edilir desteğini kaldırmak için dikkate için type(None)ve ayrıca 484 çıkarın.

Veya belki de PEP 484'ü, type(None)bunun bir tür olarak geçerli Noneolduğunu ve tek doğru yazım olduğunu önermemek için güncellemeliyiz ? Bunu yapmanın bir - ve tercihen sadece bir - bariz bir yolu olmalıdır vs.

--- JukkaL, 18 Mayıs 2018


4
Üçüncü seçeneğin neden aslında hiç de geçersiz işlevi olmadığını açıklamak için büyük bir çağrı.
никта
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.