problem with tuple+obj and list+obj expressions

Đang mở
#888 2 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Đánh giá

Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức phù hợp với người mới
25/100
Loại issue
Lỗi
Độ rõ ràng
Cần làm rõ
Mức độ hoạt động
Đình trệ
Công nghệ
javascript, python
Lĩnh vực
compilers

Hướng nghiên cứu

No source file or test is named. Start by reproducing the supplied Transcrypt Python snippet in the stated Python 3.9 and Firefox environment, then trace operator dispatch in the compiler. Done means tuple/list operations correctly honor the operand's reflected methods, including the reported addition and multiplication cases.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

There is an apparent problem with tuple + obj and list + obj expressions. Rather than call obj.__radd__, it seems that tuple.__add__/list.__add__ are called. Similar problem occurs with tuple * obj and list * obj. Problem appears to stem from the fact that tuple and list have __add__ and __mul__ methods that seem to take priority.

python code:

# __pragma__ ('opov')

class Obj:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self._message = None
    def __str__(self):
        return 'obj'
    def __add__(self, other):
        self._message = 'obj.__add__'
        return (self.x + other[0], self.y + other[1])
    def __sub__(self, other):
        self._message = 'obj.__sub__'
        return (self.x - other[0], self.y - other[1])
    def __radd__(self, other):
        self._message = 'obj.__radd__'
        return (other[0] + self.x, other[1] + self.y)
    def __rsub__(self, other):
        self._message = 'obj.__rsub__'
        return (other[0] - self.x, other[1] - self.y)
    @property
    def message(self):
        message = self._message
        self._message = None
        return message

obj = Obj(4, 2)
_tuple = (4, 2)
_list = [4, 2]

print('obj + tuple:', obj + _tuple, '\t\tcalled:', obj.message)
print('obj - tuple:', obj - _tuple, '\t\tcalled:', obj.message)
print('tuple + obj:', _tuple + obj, '\tcalled:', obj.message)
print('tuple - obj:', _tuple - obj, '\t\tcalled:', obj.message)
print('obj + list:', obj + _list, '\t\tcalled:', obj.message)
print('obj - list:', obj - _list, '\t\tcalled:', obj.message)
print('list + obj:', _list + obj, '\tcalled:', obj.message)
print('list - obj:', _list - obj, '\t\tcalled:', obj.message)

console output:

obj + tuple: (8, 4) 		called: obj.__add__
obj - tuple: (0, 0) 		called: obj.__sub__
tuple + obj: [4, 2, obj] 	called: None
tuple - obj: (0, 0) 		called: obj.__rsub__
obj + list: (8, 4) 		called: obj.__add__
obj - list: (0, 0) 		called: obj.__sub__
list + obj: [4, 2, obj] 	called: None
list - obj: (0, 0) 		called: obj.__rsub__

env: Python3.9 venv with pip install Transcrypt
testing: Firefox version 133 in Linux

Ngôn ngữ chính
Python
Star
2.9k
Fork
218
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của TranscryptOrg/Transcrypt

Tất cả issue của TranscryptOrg/Transcrypt

Issue tương tự

Thêm issue về Python

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.