ฉันจะสร้างฟังก์ชัน Python ด้วยอาร์กิวเมนต์ที่เป็นทางเลือกได้อย่างไร


219

ฉันมีฟังก์ชั่น Python ซึ่งใช้อาร์กิวเมนต์หลายตัว อาจมีการข้ามข้อโต้แย้งบางอย่างในบางสถานการณ์

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

ข้อโต้แย้งdผ่านhคือสตริงที่แต่ละอันมีความหมายต่างกัน เป็นสิ่งสำคัญที่ฉันสามารถเลือกพารามิเตอร์ทางเลือกที่จะผ่านในชุดค่าผสมใด ๆ ตัวอย่างเช่น(a, b, C, d, e)หรือ(a, b, C, g, h)หรือ(a, b, C, d, e, fหรือทั้งหมด (นี่คือตัวเลือกของฉัน)

มันจะดีมากถ้าฉันสามารถโอเวอร์โหลดฟังก์ชั่น - แต่ฉันอ่านว่า Python ไม่รองรับการโอเวอร์โหลด ฉันพยายามแทรกอาร์กิวเมนต์บางตัวที่จำเป็นในรายการ - และได้รับข้อผิดพลาดที่ไม่ตรงกัน

ตอนนี้ฉันกำลังส่งสตริงว่างแทนที่อาร์กิวเมนต์ที่หายไปสองสามตัวแรกเป็นตัวยึดตำแหน่ง ฉันต้องการจะเรียกใช้ฟังก์ชันโดยใช้ค่าจริง

มีวิธีการทำเช่นนี้? ฉันจะส่งรายการแทนรายการอาร์กิวเมนต์ได้หรือไม่

ตอนนี้ต้นแบบที่ใช้ ctypes ดูเหมือนว่า:

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

คำตอบ:


196

obj.some_function( '1', 2, '3', g="foo", h="bar" )ลองโทรมันเหมือน: หลังจากอาร์กิวเมนต์ตำแหน่งที่ต้องการคุณสามารถระบุอาร์กิวเมนต์ตัวเลือกเพิ่มเติมตามชื่อ


246

เพียงแค่ใช้พารามิเตอร์ซึ่งจะช่วยให้คุณผ่านการขัดแย้งได้มากเท่าที่คุณต้องการหลังของคุณ*args a,b,cคุณจะต้องเพิ่มตรรกะบางอย่างในแผนที่args-> c,d,e,fแต่มันเป็น "วิธี" ของการบรรทุกเกินพิกัด

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

และมันจะพิมพ์ค่าของ c,d,e,f


ในทำนองเดียวกันคุณสามารถใช้kwargsอาร์กิวเมนต์แล้วคุณสามารถตั้งชื่อพารามิเตอร์ของคุณ

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

แล้วkwargsจะมีพจนานุกรมของพารามิเตอร์ทั้งหมดที่มีค่าคีย์หลังจากa,b


ขอบคุณ. ในขณะที่ฉันไม่สามารถใช้ความยืดหยุ่นในโค้ดของฉันได้มากและไม่สามารถแก้ปัญหาการโทรหาช่องว่างต่าง ๆ ในรายการของฉันได้ แต่เป็นเครื่องมือที่ยอดเยี่ยมที่จะใช้ในโครงการอื่น และ Russel Borogove ให้คำตอบที่แน่นอนฉันต้องการสำหรับปัญหาของฉันฉันมีความสุข
Thalia

12
มันถูกเรียกว่าArbitrary อาร์กิวเมนต์รายการ
FabienB

@ ห้ามฉันชอบคำตอบของคุณจริงๆ อย่างไรก็ตามคุณสามารถช่วยอธิบายสิ่งที่c = kwargs.get('c', None)ใช้สำหรับคำสั่งได้หรือไม่? จำเป็นต้องมีในทุกฟังก์ชั่นที่มี args หรือไม่ ในรหัสของคุณคุณมี 2 ตัวเลือก args เท่านั้น เกิดอะไรขึ้นถ้าผู้ใช้ต้องการอาร์กิวเมนต์อื่นพูดe? ฉันจะเปลี่ยนรหัสตัวอย่างสำหรับ args ที่เป็นตัวเลือกจำนวนไม่ทราบเช่น 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...)อย่างไร ฉันต้องรวมc = kwargs.get('c', None) etcก่อนทำสิ่งนั้นobj.add(c, d, ...)หรือไม่?
Nemo

หากคุณกังวลเกี่ยวกับความซับซ้อนของเวลา นี่จะเป็นปัญหา
NduJay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.