Tôi đang viết một số mã để xác định tên mà đối tượng được gán. Điều này là dành cho công việc gỡ lỗi chung và để làm quen với python internals.Truy cập tên mà đối tượng đang được tạo được gán cho
Tôi có nó có cấu trúc như là một trang trí lớp để tất cả các trường hợp của lớp đó sẽ có tên của họ được ghi lại nếu nó có thể làm. Mã này khá dài nên tôi sẽ không đăng nó trừ khi được hỏi. Kỹ thuật nói chung là như sau mặc dù
trang trí lớp
__init__
phương pháp với mã để làm những gì tôi muốnthiết
caller = inspect.currentframe().f_back
và mởinspect.getframeinfo(caller).filename
và gửi choast.parse
. Tôi không làm bất kỳ lỗi kiểm tra ở đây vì (1) đây chỉ là để gỡ lỗi/profiling/hack (2) quá trình này chính xác đã được 'chỉ' hoàn thành hoặc mã sẽ không được chạy. Có vấn đề gì với điều này không?tìm ra dụ
ast.Assignment
gây ra hiện đang thực hiện__init__
phương pháp để chạynếu
len(assignment.targets) == 1
sau đó chỉ có một mục ở phía bên tay trái, và tôi có thể có được tên ra khỏitargets[0].id
. Trong một biểu mẫu đơn giản nhưa = Foo()
, thìassignment.value
là một phiên bản củaast.Call
. nếu đó là một chữ (ví dụ: danh sách), thìvalue
sẽ là danh sách đó và được bảo lãnh bởi vì đối tượng tôi quan tâm không được gán cho tên.
cách tốt nhất là gì để xác nhận rằng assignment.value.func
là trong thực tế type(obj).__call__
của đối tượng mà tôi quan tâm. Tôi khá chắc chắn rằng tôi đảm bảo rằng Đó là "ở đâu đó" hoặc mã thậm chí sẽ không chạy. Tôi chỉ cần cho nó để được ở cấp cao nhất. Điều hiển nhiên cần làm là đi bộ và đảm bảo rằng nó không chứa bất kỳ cuộc gọi nội bộ nào. Sau đó, tôi đảm bảo rằng tôi có tên. (Lý luận của tôi là chính xác, tôi không chắc chắn nếu giả định của nó là). Đây không phải là lý tưởng mặc dù bởi vì nếu tôi quan tâm đến Foo
, điều này có thể dẫn tôi quăng đi a = Foo(Bar())
bởi vì tôi không biết nếu đó là a = Bar(Foo())
.
Tất nhiên tôi chỉ có thể kiểm tra assignment.value.func.id
nhưng sau đó ai đó có thể làm Foobar = Foo
hay cái gì vì vậy tôi không muốn dựa vào điều này quá nặng nề
giúp đỡ Bất kỳ sẽ được đánh giá rất nhiều. Như thường lệ, tôi quan tâm đến bất kỳ đề xuất hoặc vấn đề nào khác mà tôi có thể nhìn thấy.
Ngoài ra, tôi thực sự ngạc nhiên khi tôi vừa phát minh ra thẻ 'python-internals'.
+ nhiều - Python rất tuyệt! – katrielalex