2014-10-15 12 views
5

Giả sử tôi muốn gỡ lỗi một lớp đơn giản với thuộc tính myattribute. Tôi tạo ra một phương pháp repr như thế này:Làm cách nào để sử dụng `str.format` trực tiếp dưới dạng` __repr__`?

class SimpleClass: 
    def __repr__(self): 
    return "{0.myattribute}".format(self) 

Nó cảm thấy một chút dư thừa, vì vậy tôi muốn sử dụng format trực tiếp:

class SimpleClass: 
    __repr__ = "{0.myattribute}".format 

... nhưng điều đó không thành công với một IndexError: tuple index out of range. Tôi hiểu rằng format không thể truy cập vào đối số self, nhưng tôi không thấy lý do.

Tôi có làm điều gì sai không, đây có phải là giới hạn CPython – hoặc điều gì khác không?

+0

Bạn có thể làm điều này '__repr__ = lambda self:" {0.myattribute} ". Định dạng (self)' nhưng tôi nghĩ nó tệ hơn một 'def' –

+2

note: đừng làm vậy. –

+1

Giải thích lách cách của tôi là nó có thể liên quan đến sự khác biệt giữa các phương thức liên kết và không ràng buộc. – NPE

Trả lời

2

"{0.myattribute}".format đã là phương pháp bị ràng buộc trên đối tượng chuỗi ("{0.myattribute}"). Vì vậy, khi mã gọi tìm cách tra cứu, giả sử, x.__repr__ (trong đó x là một ví dụ SimpleClass), Python tìm thuộc tính __repr__ của SimpleClass, nhưng sau đó không thể nhận ra nó là phương thức SimpleClass - giao thức mô tả không được tôn trọng (phương thức chuỗi không có thuộc tính __get__).

Dường như trong 3.4, sử dụng lambda sẽ hoạt động, mặc dù tôi có thể tuyên thệ nó phải là một chức năng thực sự trong các phiên bản trước. functools.partial sẽ không hoạt động. Nhưng bạn thực sự cần phải sử dụng một chức năng thực sự anyway. Xin lỗi nó không phải là DRY như bạn muốn.

+1

Lambdas có thể làm điều này trong 2,7 –

+0

Cảm ơn bạn đã giải thích, nhưng bạn có chắc chắn với đối số '__get__' không? Từ những gì tôi tìm thấy, nó liên quan đến thuộc tính '__self__'. Dù sao, tôi sẽ phải làm một số nghiên cứu về lý do tại sao phương pháp ràng buộc được thiết kế như thế này. – emu

+0

Aha, nó thực sự là '__get__'. Nó chỉ là một điều đáng tiếc mà dường như không có trong tài liệu chính thức, tôi đã phải đọc một vài bài đăng trên blog. – emu

Các vấn đề liên quan