Dalam python 3.x, adalah umum untuk menggunakan anotasi tipe kembalian dari suatu fungsi, seperti:
def foo() -> str:
return "bar"
Apa anotasi yang benar untuk tipe "void"?
Saya sedang mempertimbangkan 3 opsi:
def foo() -> None:
- bukan IMO logis, karena
None
bukan tipe,
- bukan IMO logis, karena
def foo() -> type(None):
- menggunakan sintaks terbaik yang saya tahu untuk memperolehnya
NoneType
,
- menggunakan sintaks terbaik yang saya tahu untuk memperolehnya
def foo():
- hilangkan informasi tipe pengembalian eksplisit.
Opsi 2. tampaknya paling logis bagi saya, tetapi saya telah melihat beberapa contoh 1.
python
annotations
void
type-hinting
Tregoreg
sumber
sumber
void
tipe kembalian. Fungsi apa pun (atau cabang dalam suatu fungsi) tanpa eksplisitreturn
akan kembaliNone
. Saya berasumsi OP memahami bahwa, komentar ini sebagian besar untuk kepentingan pembaca di masa mendatang ...Jawaban:
Ini langsung dari PEP 484 - dokumentasi Type Hints :
Dan, seperti yang Anda lihat sebagian besar contoh digunakan
None
sebagai tipe kembalian.sumber
NoReturn
Jenis digunakan "... untuk menganotasi fungsi yang tidak pernah kembali secara normal. Misalnya, fungsi yang tanpa syarat menimbulkan pengecualian ..."TLDR: Persamaan idiomatik dari
void
anotasi tipe kembalian adalah-> None
.def foo() -> None: ...
Ini cocok dengan fungsi yang tidak
return
atau hanya kosongreturn
mengevaluasiNone
.def void_func(): # unannotated void function pass print(void()) # None
Menghilangkan tipe pengembalian tidak berarti tidak ada nilai pengembalian. Sesuai PEP 484 :
Ini berarti nilai dianggap diketik secara dinamis dan mendukung operasi apa pun secara statis . Secara praktis, arti kebalikan dari
void
.Mengisyaratkan tipe dengan Python tidak secara ketat membutuhkan tipe sebenarnya. Sebagai contoh, penjelasan dapat menggunakan string dari nama jenis:
Union[str, int]
,Union[str, 'int']
,'Union[str, int]'
dan berbagai varian yang setara.Demikian pula, anotasi jenis
None
dianggap berarti "dariNoneType
". Ini dapat digunakan tidak hanya untuk tipe pengembalian, meskipun Anda akan paling sering melihatnya di sana:bar : None def foo(baz: None) -> None: return None
Ini juga berlaku untuk tipe generik. Misalnya, Anda dapat menggunakan
None
inGenerator[int, None, None]
untuk menunjukkan generator tidak mengambil atau mengembalikan nilai.Meskipun PEP 484 menunjukkan bahwa
None
berartitype(None)
, Anda tidak harus menggunakan bentuk terakhir eksplisit. Spesifikasi petunjuk tipe tidak menyertakan bentuk apa puntype(...)
. Ini secara teknis adalah ekspresi runtime, dan dukungannya sepenuhnya bergantung pada pemeriksa jenis. Themypy
proyek mempertimbangkan untuk membuang dukungan untuktype(None)
dan menghapusnya dari 484 juga.sumber