แทนที่ผู้ดำเนินการ 'in' ของ Python?


199

ถ้าฉันสร้างคลาสของตัวเองใน Python ฉันควรกำหนดฟังก์ชั่นอะไรเพื่อให้สามารถใช้โอเปอเรเตอร์ 'in' ได้เช่น

class MyClass(object):
    ...

m = MyClass()

if 54 in m:
    ...

ฉันกำลังค้นหาวิธีการแทนที่isและis notตัวดำเนินการ เหมือนจะยังสามารถที่จะเขียนquery = tinydb.Query().field == value Query().field is not Noneแต่ดูเหมือนว่าฉันทิ้งให้อยู่กับ__eq__และ__ne__เวลาเป็นอยู่ซึ่งนำไปสู่การ Query().field != Noneunpythonic (sarc)
Tomasz Gandor

คำตอบ:



194

คำตอบที่สมบูรณ์มากขึ้นคือ:

class MyClass(object):

    def __init__(self):
        self.numbers = [1,2,3,4,54]

    def __contains__(self, key):
        return key in self.numbers

ที่นี่คุณจะได้รับจริงเมื่อถามว่า 54 อยู่ใน m:

>>> m = MyClass()
>>> 54 in m
True  

ดูเอกสารเกี่ยวกับการบรรทุกเกินพิกัด__contains__


@pthulin คุณอาจ "สมบูรณ์กว่า" ในแง่ของรหัส แต่ลิงก์ของ Ignacio ไปยังเอกสารซึ่งเป็นข้อดีสำหรับบางคนเสมอ
Peter Hansen

16
@ Peter ใช่ แต่พวกเราบางคนชอบคำตอบที่ดีและเป็นภาพ อิกนาชิโอทำอะไรเล็ก ๆ น้อย ๆ เพื่อให้เกิดประโยชน์กับคำถามอื่นนอกเหนือจากชี้นำเราที่นี่ก่อนแทนที่จะเป็นกูเกิ้ล
Zoran Pavlovic

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

13
ทั้งหมดเชื่อมโยงตายและนั่นคือเหตุผลที่คำตอบของ Ignacio สั่นคลอนใน SO ลิงก์ + ตัวอย่างนั้นดีที่สุดและนั่นคือสาเหตุที่การรวมกันของสองคำตอบที่เรากำลังพูดถึงนั้นดีที่สุด
demongolem

1
@demongolem เอกสาร Python อย่างเป็นทางการจะตายด้วยหรือหลังจากล่ามไม่สามารถดาวน์โหลดได้ และมันไม่ใช่คำตอบสำหรับลิงค์เท่านั้น ฉันมาที่หน้านี้เพื่อค้นหาคำตอบและพบว่าไม่มีการคลิกลิงก์เพิ่มเติมใด ๆ (เช่นต้นแบบเพียงพอ) ฉันเห็นด้วยในหลักการ แต่ imho ที่ใช้ไม่ได้ที่นี่
wizzwizz4

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