Yazım ipuçlarını kullanarak birden çok dönüş türü belirtme


211

Python a boolveya a dönebilir bir işlevi var list. Tür ipuçlarını kullanarak dönüş türlerini belirtmenin bir yolu var mı?

Örneğin, bunu yapmanın doğru yolu var mı?

def foo(id) -> list or bool:
      ...

5
bir liste veya bir boole ile nasıl sonuçlanır?
Padraic Cunningham

11
@PadraicCunningham Belki de uygulama size kimliğimi göndereceğim, bana bir liste veya bir boole gönderiyorsunuz : D
Bhargav Rao

muhtemelen bu zayıf bir uygulamadır
Sławomir Lenart

@PadraicCunningham Çok Biçimlilik. İşleviniz girdi üzerinde bir denetim gerçekleştirirse, her neyse, bir değişkeni beslediğinizde bir boole almak veya bir değişken listesini beslerken booleanların bir listesini almak istersiniz.
Guimoute

Yanıtlar:


290

Gönderen dokümantasyon

sınıf typing.Union

Birlik türü; Birlik [X, Y], X veya Y anlamına gelir.

Dolayısıyla, birden fazla geri dönüş veri türünü temsil etmenin uygun yolu

from typing import Union


def foo(client_id: str) -> Union[list,bool]

Ancak yazmanın zorunlu olmadığını unutmayın. Python, dinamik olarak yazılmış bir dil olarak kalmaya devam eder. Ek açıklama sözdizimi, üretime geçmeden önce kodun geliştirilmesi sırasında yardımcı olmak için geliştirilmiştir. PEP 484'ün belirttiği gibi, "çalışma zamanında hiçbir tür denetimi gerçekleşmez".

>>> def foo(a:str) -> list:
...     return("Works")
... 
>>> foo(1)
'Works'

Gördüğünüz gibi bir int değeri geçiyorum ve bir str döndürüyorum. Ancak, __annotations__ilgili değerlere ayarlanır.

>>> foo.__annotations__ 
{'return': <class 'list'>, 'a': <class 'str'>}

Tip ipuçları hakkında daha fazla bilgi için lütfen PEP 483'ü inceleyin . Ayrıca bkz . Python 3.5'te Tip ipuçları nelerdir ?

Lütfen bunun sadece Python 3.5 ve üstü için geçerli olduğunu unutmayın . Bu, PEP 484'te açıkça belirtilmektedir .


Python 3.4'te eşdeğer mi var?
Yahya Uddin

1
@YahyaUddin Nope - PEP 484 : '(.... Sadece Python3.5 için.
Rao

1
@YahyaUddin Oldukça şaşırtıcı. Şunu mu demek istediniz: Fonksiyon Ek Açıklamaları herhangi bir şans eseri?
Bhargav Rao

2
Bakalım bunu anladım. Python 3.4, ek açıklama dışında zorlanmış DEĞİL başka bir şey yapmayan fonksiyon açıklamalarına sahiptir. Ancak Python 3.5'te bu gerçek tip kontrolüdür.
Yahya Uddin

1
@BhargavRao, bunun için üzgünüm! Sadece yorum bölümünde ayrılmanın çok önemli olduğunu hissettim.
Bobort

26

Değerlendirildiğinde ifade def foo(client_id: str) -> list or bool:eşdeğerdir def foo(client_id: str) -> list:ve bu nedenle istediğinizi yapmaz.

Yerli yolu "ya A veya B" tipi ipucu açıklamak için Birlik (Bhargav Rao sayesinde):

def foo(client_id: str) -> Union[list, bool]:

Ben "Neden yine de yapmak istiyorsun" adam olmak istemiyorum, ama belki 2 dönüş türlerine sahip olmak istediğiniz şey değildir:

Bir tür özel hata durumunu belirtmek için bir bool döndürmek istiyorsanız, bunun yerine İstisnalar'ı kullanmayı düşünün. Bir bool'u özel bir değer olarak döndürmek isterseniz, boş bir liste iyi bir temsil olabilir. Ayrıca bununla Nonebirlikte iade edilebileceğini de belirtebilirsiniz.Optional[list]


6
Birden çok türün döndürülmesinin istediğiniz gibi olabileceği kullanımlar vardır: örneğin, bazı alt türlerden birini döndürmeniz gerekiyor, ancak diğer alt türlerden birini döndürmeniz gerekiyorsa veya verileri işlemeye çalışıyorsanız ve işlem yapılmıyorsa ham formu döndürmek istiyorsanız mevcut değil. Ayrıca, eski kodu sarıyorsanız, yükseltme işlemine ve / veya garip yerleri görmesine yardımcı olduğu için oldukça yararlı olabilir.
Nathaniel Ford

İstisnalar ve boş liste fikri de yardımcı oldu. teşekkürler
Yahya Uddin

20

Herhangi birinin buraya "birden çok dönüş değeri türü nasıl belirtilir?" Tuple[type_value1, ..., type_valueN]

from typing import Tuple

def f() -> Tuple[dict, str]:
    a = {1: 2}
    b = "hello"
    return a, b

Daha fazla bilgi: https://code-examples.net/en/q/2651e60

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.