İsteğe bağlı bağımsız değişkenlerle nasıl Python işlevi oluşturabilirim?


220

Birkaç argüman alan bir Python işlevi var. Bu argümanlardan bazıları bazı senaryolarda atlanabilir.

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

dAracılığıyla yapılan argümanlar , hher birinin farklı anlamları olan dizelerdir. Herhangi bir kombinasyonda hangi isteğe bağlı parametrelerin geçeceğini seçebilmem önemlidir. Örneğin (a, b, C, d, e),, veya (a, b, C, g, h), veya (a, b, C, d, e, f, veya hepsi (bunlar benim seçimlerim).

İşlevi aşırı yükleyebilmem harika olurdu - ama Python'un aşırı yüklemeyi desteklemediğini okudum. Listeye gerekli int bağımsız değişkenlerini eklemeye çalıştım - ve bir argüman uyuşmazlığı hatası aldım.

Şu anda yer tutucu olarak ilk birkaç eksik argümanın yerine boş dizeler gönderiyorum. Sadece gerçek değerleri kullanarak bir fonksiyonu çağırabiliyorum.

Bunu yapmanın bir yolu var mı? Argüman listesi yerine bir liste iletebilir miyim?

Şu anda ctypes kullanan prototip şuna benziyor:

_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]

Yanıtlar:


197

Gibi aramayı deneyin: obj.some_function( '1', 2, '3', g="foo", h="bar" ). Gerekli konum bağımsız değişkenlerinden sonra, isteğe bağlı olarak belirli isteğe bağlı bağımsız değişkenler adıyla belirleyebilirsiniz.


246

Sadece *argsparametrenizi kullanın , bu da parametrenizden sonra istediğiniz kadar argüman iletmenize izin verir a,b,c. Haritaya bazı mantık eklemeniz gerekir args-> c,d,e,fama bu aşırı yüklenmenin "yolu" dur.

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

Ve değerleri yazdıracak c,d,e,f


Benzer şekilde, kwargsargümanı kullanabilir ve ardından parametrelerinizi adlandırabilirsiniz.

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

Ve sonra kwargsanahtar değere sahip tüm parametrelerin sözlüğüne sahip olura,b


Teşekkür ederim. Kodumda bu kadar esnekliği kullanamasam da ve listemdeki çeşitli boş deliklerle arama sorunumu çözmese de, farklı bir projede kullanılmak için harika bir araçtır. ve Russel Borogove sorunum için gereken cevabı bana verdi, mutluyum.
Thalia


@Nix, cevabını gerçekten beğendim. Ancak, ifadenin ne için c = kwargs.get('c', None)kullanıldığını açıklar mısınız? İsteğe bağlı argümanları olan her fonksiyonda gerekli mi? Kodunuzda yalnızca 2 isteğe bağlı argüman vardı. Kullanıcı başka bir arg demek isterse e? Nasıl ex, isteğe bağlı args herhangi bilinmeyen sayısı için örnek kod değiştirebilir: 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...)? Bunu c = kwargs.get('c', None) etcyapmadan önce eklemem gerekir obj.add(c, d, ...)mi?
Nemo

Eğer zaman karmaşıklığından endişe ediyorsanız. Bu bir sorun olurdu
NduJay
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.