Bagaimana cara membuat fungsi Python dengan argumen opsional?

222

Saya memiliki fungsi Python yang membutuhkan beberapa argumen. Beberapa argumen ini dapat dihilangkan dalam beberapa skenario.

def some_function (self, a, b, c, d = None, e = None, f = None, g = None, h = None):
    #code

Argumen dmelalui hadalah string yang masing-masing memiliki makna berbeda. Penting bahwa saya dapat memilih parameter opsional mana yang akan lulus dalam kombinasi apa pun. Misalnya,, (a, b, C, d, e)atau (a, b, C, g, h), atau (a, b, C, d, e, f, atau semuanya (ini adalah pilihan saya).

Akan lebih bagus jika saya bisa membebani fungsinya - tetapi saya membaca bahwa Python tidak mendukung overloading. Saya mencoba untuk memasukkan beberapa argumen int yang diperlukan dalam daftar - dan mendapatkan kesalahan ketidakcocokan argumen.

Saat ini saya mengirim string kosong untuk menggantikan beberapa argumen pertama yang hilang sebagai placeholder. Saya ingin dapat memanggil fungsi hanya menggunakan nilai aktual.

Apakah ada cara untuk melakukan ini? Bisakah saya melewati daftar alih-alih daftar argumen?

Sekarang prototipe menggunakan ctypes terlihat seperti:

_fdll.some_function.argtypes = [c_void_p, c_char_p, c_int, c_char_p, c_char_p, c_char_p, c_char_p, c_char_p]
Thalia
sumber

Jawaban:

198

Cobalah menyebutnya seperti: obj.some_function( '1', 2, '3', g="foo", h="bar" ). Setelah argumen posisi yang diperlukan, Anda dapat menentukan argumen opsional spesifik berdasarkan nama.

Russell Borogove
sumber
246

Cukup gunakan *argsparameter, yang memungkinkan Anda untuk memberikan argumen sebanyak yang Anda inginkan setelah a,b,c. Anda harus menambahkan beberapa logika ke peta args-> c,d,e,ftetapi ini merupakan "cara" overloading.

def myfunc(a,b, *args, **kwargs):
   for ar in args:
      print ar
myfunc(a,b,c,d,e,f)

Dan itu akan mencetak nilai c,d,e,f


Demikian pula Anda bisa menggunakan kwargsargumen dan kemudian Anda bisa memberi nama parameter Anda.

def myfunc(a,b, *args, **kwargs):
      c = kwargs.get('c', None)
      d = kwargs.get('d', None)
      #etc
myfunc(a,b, c='nick', d='dog', ...)

Lalu kwargs akan memiliki kamus semua parameter yang kunci dinilai setelahnyaa,b

Nix
sumber
Terima kasih. Walaupun saya tidak dapat menggunakan fleksibilitas sebanyak ini dalam kode saya, dan itu tidak menyelesaikan masalah saya dengan berbagai lubang kosong dalam daftar saya, ini adalah alat yang hebat untuk digunakan dalam proyek yang berbeda. dan Russel Borogove memberi saya jawaban tepat yang saya butuhkan untuk masalah saya, saya senang.
Thalia
12
Ini disebut Daftar Argumen Sewenang
FabienB
@Nix, saya sangat suka jawaban Anda. Namun, bisakah Anda menjelaskan apa pernyataan c = kwargs.get('c', None)itu digunakan? Apakah diperlukan di setiap fungsi yang memiliki argumen opsional? Dalam kode Anda, Anda hanya memiliki 2 argumen opsional. Bagaimana jika pengguna menginginkan argumen lain e? Bagaimana saya bisa mengubah kode sampel Anda untuk jumlah yang tidak diketahui args opsional, untuk ex: def my_func(a, b, *args, **kwagars): obj = <do something with a & b> obj.add(c) obj.add(d) continue obj.add(for e, f, g...)? Apakah saya harus memasukkan c = kwargs.get('c', None) etcsebelum melakukan obj.add(c, d, ...)?
Nemo
Jika Anda khawatir tentang kompleksitas waktu. Ini akan menjadi masalah
NduJay