Apakah ada cara di Python untuk meneruskan parameter opsional ke fungsi saat memanggilnya dan dalam definisi fungsi memiliki beberapa kode berdasarkan "hanya jika parameter opsional dilewatkan"
The Python 2 dokumentasi, 7,6. Definisi fungsi memberi Anda beberapa cara untuk mendeteksi apakah penelepon menyediakan parameter opsional.
Pertama, Anda dapat menggunakan sintaks parameter formal khusus *
. Jika definisi fungsi memiliki parameter formal yang didahului oleh satu *
, maka Python mengisi parameter itu dengan parameter posisi apa pun yang tidak cocok dengan parameter formal sebelumnya (sebagai tupel). Jika definisi fungsi memiliki parameter formal yang didahului oleh **
, maka Python mengisi parameter itu dengan parameter kata kunci apa pun yang tidak cocok dengan parameter formal sebelumnya (sebagai dict). Implementasi fungsi dapat memeriksa konten dari parameter ini untuk "parameter opsional" apa pun yang Anda inginkan.
Misalnya, inilah fungsi opt_fun
yang mengambil dua parameter posisi x1
dan x2
, dan mencari parameter kata kunci lain bernama "opsional".
>>> def opt_fun(x1, x2, *positional_parameters, **keyword_parameters):
... if ('optional' in keyword_parameters):
... print 'optional parameter found, it is ', keyword_parameters['optional']
... else:
... print 'no optional parameter, sorry'
...
>>> opt_fun(1, 2)
no optional parameter, sorry
>>> opt_fun(1,2, optional="yes")
optional parameter found, it is yes
>>> opt_fun(1,2, another="yes")
no optional parameter, sorry
Kedua, Anda dapat memberikan nilai parameter default dari beberapa nilai None
yang tidak akan pernah digunakan oleh penelepon. Jika parameter memiliki nilai default ini, Anda tahu penelepon tidak menentukan parameter. Jika parameter memiliki nilai non-default, Anda tahu itu berasal dari pemanggil.
positional_parameters
adalah tuple, dankeyword_parameters
kamus.formal parameters preceded by *
(apa ini namanya?) Dari akeyword parameter
? Seperti yang saya pahami, parameter kata kunci ditentukan menggunakan=
operator dalam panggilan fungsi (jadiopt_fun(1,2, optional="yes")
berikan argumen kata kunci "ya" untuk fungsi yang mengantisipasi, tetapi tidak selalu memerlukan, parameteroption
).formal parameters preceded by *
hanya sebagai "argumen yang diberikan penelepon yang tidak sesuai dengan argumen posisional yang berjalan sebelum argumen kata kunci". Misalnya, diopt_fun(1,2, "blah", 3.14, mykey="yes", myyear="2018")
,"blah"
dan karena3.14
beradaforma arguments preceded by *
di antara dua argumen posisi dan argumen yang menggunakan=
tanda. Tuple yang dihasilkanpositional_parameter
akan menjadi rangkap yang:("blah", 3.14)
. Apakah ini benar?parameter
" bukan "parameters
" untuk "preceded by *
". Bahasa hanya memungkinkan satu*identifier
dalam daftar parameter. b) baca docs.python.org/2/reference/… , c) baca docs.python.org/2/reference/expressions.html#calls . Maaf, kehabisan karakter yang diizinkan dalam komentar ini.http://docs.python.org/2/tutorial/controlflow.html#default-argument-values
Saya menemukan ini lebih mudah dibaca daripada menggunakan
**kwargs
.Untuk menentukan apakah argumen telah dilewati sama sekali, saya menggunakan objek utilitas khusus sebagai nilai default:
sumber
default_value=100; def my_func(mandatory_argument, optional_argument_with_default_value=default_value): ...
sumber
op(b=2)
Jika Anda ingin memberikan beberapa nilai default ke nilai penetapan parameter di (). suka (x = 10). Tetapi yang penting adalah pertama-tama harus argumen wajib kemudian nilai default.
misalnya.
(y, x = 10)
tapi
(x = 10, y) salah
sumber
*arg
**karg
argumen fungsi. cari di google.Anda dapat menentukan nilai default untuk argumen opsional dengan sesuatu yang tidak akan pernah diteruskan ke fungsi dan memeriksanya dengan
is
operator:maka selama Anda tidak melakukannya,
func(_NO_DEFAULT)
Anda dapat secara akurat mendeteksi apakah argumennya disetujui atau tidak, dan tidak seperti jawaban yang diterima Anda tidak perlu khawatir tentang efek samping dari notasi **:sumber
_NO_DEFAULT = object()
.help(func)
Anda mendapatkan ide yang lebih jelas bagaimana argumen ditafsirkan jika tidak disahkan secara eksplisit.