Anda sedang mencari Optional
.
Karena jenis pengembalian Anda dapat datetime
(dikembalikan dari datetime.utcnow()
) atau None
Anda harus menggunakan Optional[datetime]
:
from typing import Optional
def get_some_date(some_argument: int=None) -> Optional[datetime]:
# as defined
Dari dokumentasi tentang pengetikan, Optional
adalah singkatan untuk:
Optional[X]
setara dengan Union[X, None]
.
di mana Union[X, Y]
berarti nilai tipe X
atau Y
.
Jika Anda ingin menjadi eksplisit karena kekhawatiran bahwa orang lain mungkin tersandung Optional
dan tidak menyadari artinya, Anda selalu dapat menggunakan Union
:
from typing import Union
def get_some_date(some_argument: int=None) -> Union[datetime, None]:
Tapi saya ragu ini adalah ide yang bagus, Optional
adalah nama indikatif dan tidak menghemat beberapa penekanan tombol.
Seperti yang ditunjukkan dalam komentar oleh @ Michael0x2a Union[T, None]
diubah Union[T, type(None)]
jadi tidak perlu digunakan di type
sini.
Secara visual ini mungkin berbeda tetapi secara programatik, dalam kedua kasus, hasilnya persis sama ; Union[datetime.datetime, NoneType]
akan menjadi tipe yang disimpan di 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]}
* Gunakan typing.get_type_hints
untuk mengambil __annotations__
atribut objek alih-alih mengaksesnya secara langsung.
Union[datetime, type(None)]
untukUnion[datetime, None]
- menurut PEP 484 , menggunakanNone
dalam penjelasan jenis selalu diperlakukan sebagai setara dengantype(None)
. (typing
Dokumentasi sebenarnya digunakanNone
dalam kebanyakan kasus, tetapi tidak di sini, yang merupakan pengawasan).Optional[T]
tipe terkenal di komunitas pemrograman fungsional. Pembaca tidak hanya akan tahu artinyaUnion[T, None]
, tetapi juga akan mengenali pola penggunaan bahwa fungsi akan mengembalikan Tidak ada ketika tidak ada jawaban yang berarti, ada kesalahan, atau hasilnya tidak ditemukan.