Tôi có một chút lớp helper:Tại sao Python không có phương thức "__req__" (phản ánh bình đẳng)?
class AnyOf(object):
def __init__(self, *args):
self.elements = args
def __eq__(self, other):
return other in self.elements
này cho phép tôi làm điều kỳ diệu ngọt ngào như:
>>> arr = np.array([1,2,3,4,5])
>>> arr == AnyOf(2,3)
np.array([False, True, True, False, False])
mà không cần phải sử dụng một danh sách hiểu biết (như trong np.array(x in (2,3) for x in arr
).
(Tôi duy trì một giao diện người dùng duy nhất cho phép() sử dụng tin cậy gõ vào đoạn mã tùy ý, và a == AnyOf(1,2,3)
là rất nhiều ngon miệng hơn một danh sách hiểu biết cho người dùng phi kỹ thuật am hiểu.)
Tuy nhiên!
Điều này chỉ hoạt động một chiều! Ví dụ, nếu tôi đã làm AnyOf(2,3) == arr
thì phương thức __eq__
của lớp không bao giờ được gọi: thay vào đó, phương thức __eq__
của mảng NumPy được gọi, mà nội bộ (tôi sẽ đoán) gọi phương thức __eq__
của tất cả các phần tử của nó.
Điều này khiến tôi tự hỏi: tại sao Python không cho phép một mặt tương đương với __eq__
? (Tương đương với phương pháp như __radd__
, __rmul__
, vân vân.)
"Tại sao Python không có X?" không phải là một câu hỏi rất hiệu quả. Nếu bạn muốn Python có X, cách hiệu quả để thực hiện điều đó xảy ra là tuân theo [quy trình trong PEP-1] (https://www.python.org/dev/peps/pep-0001/#start-with- một ý tưởng-cho-python) để thực sự đề xuất ý tưởng và nhận phản hồi từ những người có tiếng nói về những gì được thêm vào ngôn ngữ. Nếu không, "Có cách nào để có được hiệu ứng hữu ích của X trong Python không?" có nhiều khả năng thực sự có kết quả hữu ích ngay lập tức (tạo ra ánh sáng thay vì nhiệt). –
Liên quan: https://stackoverflow.com/questions/3588776/how-is-eq-handled-in-python-and-in-what-order – Craig
Thực ra tôi không thể nhận ra nhu cầu cấp bách cho một lớp trong ví dụ ở trên. Tại sao không sử dụng một hàm đơn giản, trả về một danh sách? – guidot