Saya menggunakan Python 3.6.1, dan saya menemukan sesuatu yang sangat aneh. Saya mengalami kesalahan ketik tugas kamus sederhana yang membutuhkan waktu lama untuk menemukannya.
context = {}
context["a"]: 2
print(context)
Keluaran
{}
Apa yang context["a"]: 2
dilakukan kode itu ? Itu tidak menaikkan SyntaxError
kapan harus IMO. Awalnya saya pikir itu membuat sepotong. Namun, pengetikan repr(context["a"]: 2)
menimbulkan a SyntaxError
. Saya juga mengetik context["a"]: 2
di konsol dan konsol tidak mencetak apa pun. Saya pikir mungkin itu kembali None
, tetapi saya tidak begitu yakin.
Saya juga berpikir itu bisa menjadi satu baris pernyataan if, tetapi itu juga seharusnya tidak menjadi sintaks yang tepat.
Selain itu, context["a"]
harus menaikkan a KeyError
.
Saya bingung Apa yang sedang terjadi?
python
python-3.x
justengel
sumber
sumber
Jawaban:
Anda tidak sengaja menulis anotasi variabel yang benar secara sintaksis . Fitur itu diperkenalkan di Python 3.6 (lihat PEP 526 ).
Meskipun anotasi variabel diurai sebagai bagian dari tugas yang dianotasi , pernyataan tugas bersifat opsional :
Jadi, dalam
context["a"]: 2
context["a"]
adalah target anotasi2
adalah anotasi itu sendiricontext["a"]
dibiarkan tidak dimulaiPEP menyatakan bahwa "target anotasi dapat berupa target penugasan tunggal yang valid, setidaknya secara sintaksis (terserah pemeriksa jenis apa yang harus dilakukan dengan ini)" , yang berarti bahwa kunci tidak perlu ada untuk menjadi beranotasi (karenanya tidak
KeyError
). Berikut contoh dari PEP asli:Biasanya, ekspresi anotasi harus dievaluasi ke jenis Python - setelah semua penggunaan utama anotasi adalah petunjuk jenis, tetapi tidak diberlakukan. Anotasi dapat berupa ekspresi Python apa pun yang valid , apa pun jenis atau nilai hasilnya.
Seperti yang Anda lihat, saat ini petunjuk tipe sangat permisif dan jarang berguna, kecuali Anda memiliki pemeriksa tipe statis seperti mypy .
sumber
=
operator penugasan? Kuncinya tidak ada. Ini terasa salah bagiku.:
adalah operator penugasan. Kami hanya "menetapkan" anotasi jenis saja, bukan kunci. Saya ragu ada alasan untuk mengizinkannya, hanya efek samping yang tidak disengaja dari penambahan sintaks anotasi.x: str
dan segera diikuti olehtype(x)
, penerjemah akan memunculkan aNameError
. IMO sintaks harus menegakkan objek yang telah ditentukan sebelumnya, atau ditentukan di tempat. Ini hanya menimbulkan kebingungan.x = 'i am a string'
prior untukx: str
membuat jenis yang terakhir menjadi mubazir .. Ini seharusnya tidak ditambahkan sama sekali. Itu bagus sebagai komentar; Saya tidak pernah menunjukkannya digunakan dengan satu atau lain cara.