"Nullable" dönüş türünü tür ipuçlarıyla belirleme


177

Bir fonksiyonum olduğunu varsayalım:

def get_some_date(some_argument: int=None) -> %datetime_or_None%:
    if some_argument is not None and some_argument == 1:
        return datetime.utcnow()
    else:
        return None

Olabilecek bir şey için dönüş türünü nasıl belirleyebilirim None?

Yanıtlar:


279

Arıyorsunuz Optional.

İade türünüz olabileceğinden datetime(iade edildiği gibi datetime.utcnow()) veya Noneşunları kullanmanız gerekir Optional[datetime]:

from typing import Optional

def get_some_date(some_argument: int=None) -> Optional[datetime]:
    # as defined

Yazma ile ilgili belgelere göre Optionalkısayol:

Optional[X]eşittir Union[X, None].

burada Union[X, Y]türde bir değer anlamına gelir Xya da Y.


Başkalarının tökezleyebileceği Optionalve bunun anlamının farkında olamayacağı endişeleri nedeniyle açık olmak istiyorsanız, her zaman şunları kullanabilirsiniz Union:

from typing import Union

def get_some_date(some_argument: int=None) -> Union[datetime, None]:

Ama bunun iyi bir fikir olduğunu, Optionalgösterge edici bir isim olduğunu ve birkaç tuş vuruşunu kurtardığını sanıyorum .

@ Michael0x2a tarafından yapılan yorumlarda belirtildiği gibi burada kullanılmaya gerek olmadığı Union[T, None]için transforme edilmiştir .Union[T, type(None)]type

Görsel olarak bunlar farklı olabilir, ancak programlı olarak, her iki durumda da sonuç tamamen aynıdır ; *Union[datetime.datetime, NoneType] içinde saklanan tip olacaktır :get_some_date.__annotations__

>>> from typing import get_type_hints
>>> print(get_type_hints(get_some_date))
{'return': typing.Union[datetime.datetime, NoneType],
 'some_argument': typing.Union[int, NoneType]}

* Kullanım typing.get_type_hintsnesnelerin kapmak için __annotations__doğrudan erişmek yerine niteliğini.


10
Sen kolaylaştırabilirsiniz Union[datetime, type(None)]için Union[datetime, None]uygun - PEP 484 kullanarak, Nonetür ek açıklaması içinde daima eşdeğer olarak kabul edilir type(None). ( typingBelgeler aslında Noneçoğu durumda kullanılır, ancak burada kullanılmaz, bu bir gözetimdir).
Michael0x2a

@ Michael0x2a bunu bilmiyordu, ilginç. Ekledi :)
Dimitris Fasarakis Hilliard

4
Devam ettim ve bunu düzeltmek için bir yama gönderdim , bu yüzden umarım dokümanlar yakın gelecekte bu konuda daha tutarlı olacaklar!
Michael0x2a

1
Optional[T]Tip fonksiyonel programlama toplumda iyi bilinmektedir. Okuyucu sadece bunun ne anlama geldiğini bilmekle kalmayacak Union[T, None], aynı zamanda anlamlı bir cevap olmadığında, bir hata olduğunda veya sonuç bulunamadığında işlevin döndüreceği kullanım modelini de tanıyacaktır.
wks
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.