ผมไม่ทราบว่านี้เป็นฟังก์ชั่นการผูกมัดมากที่สุดเท่าที่มันเป็นcallableผูกมัด แต่เนื่องจากฟังก์ชั่นที่มี callables ผมคิดว่ามีอันตรายทำไม่มี ไม่ว่าจะด้วยวิธีใดมีสองวิธีที่ฉันคิดได้:
การจำแนกย่อยintและการกำหนด__call__:
วิธีแรกจะเป็นการใช้intคลาสย่อยที่กำหนดเองซึ่งกำหนดว่า__call__จะส่งคืนอินสแตนซ์ใหม่ของตัวมันเองด้วยค่าที่อัปเดต:
class CustomInt(int):
def __call__(self, v):
return CustomInt(self + v)
addขณะนี้สามารถกำหนดฟังก์ชันเพื่อส่งคืนCustomIntอินสแตนซ์ได้ซึ่งในฐานะที่เรียกได้ว่าส่งคืนค่าที่อัปเดตของตัวเองสามารถเรียกแบบต่อเนื่องได้:
>>> def add(v):
... return CustomInt(v)
>>> add(1)
1
>>> add(1)(2)
3
>>> add(1)(2)(3)(44)
50
นอกจากนี้ในฐานะintคลาสย่อยค่าที่ส่งคืนจะยังคงรักษา__repr__และ__str__พฤติกรรมของints สำหรับการดำเนินงานที่ซับซ้อนมากขึ้น แต่คุณควรกำหนด dunders อื่น ๆ อย่างเหมาะสม
ดังที่ @Caridorc ระบุไว้ในความคิดเห็นaddสามารถเขียนได้ง่ายๆว่า:
add = CustomInt
การเปลี่ยนชื่อชั้นเรียนเป็นaddแทนที่จะCustomIntทำงานในลักษณะเดียวกัน
กำหนดการปิดต้องมีการเรียกพิเศษเพื่อให้ได้มูลค่า:
วิธีเดียวที่ฉันคิดได้คือฟังก์ชันซ้อนที่ต้องการการเรียกอาร์กิวเมนต์ว่างเปล่าพิเศษเพื่อที่จะส่งคืนผลลัพธ์ ฉันไม่ได้ใช้nonlocalและเลือกที่จะแนบแอตทริบิวต์กับวัตถุฟังก์ชันเพื่อให้พกพาได้ระหว่าง Pythons:
def add(v):
def _inner_adder(val=None):
"""
if val is None we return _inner_adder.v
else we increment and return ourselves
"""
if val is None:
return _inner_adder.v
_inner_adder.v += val
return _inner_adder
_inner_adder.v = v
return _inner_adder
สิ่งนี้จะคืนค่าตัวเองอย่างต่อเนื่อง ( _inner_adder) ซึ่งหากมีการให้ a valจะเพิ่มขึ้น ( _inner_adder += val) และถ้าไม่คืนค่าตามที่เป็นอยู่ อย่างที่ฉันพูดไปมันต้องมีการ()โทรพิเศษเพื่อส่งคืนค่าที่เพิ่มขึ้น:
>>> add(1)(2)()
3
>>> add(1)(2)(3)()
6