2008-12-18 37 views
8

Dưới đây là một đoạn mã từ bên trong TurboGears 1.0.6:Cú pháp trang trí [] -queque trong Python nghĩa là gì?

[dispatch.generic(MultiorderGenericFunction)] 
def run_with_transaction(func, *args, **kw): 
    pass 

tôi không thể tìm ra cách đưa một danh sách trước khi định nghĩa hàm có thể có thể ảnh hưởng nó.

Trong docstring dispatch.generic, nó đề cập đến:

Lưu ý rằng khi sử dụng các phiên bản Python cũ hơn, bạn phải sử dụng '[dispatch.generic()]' thay vì '@ dispatch.generic()'.

OK, vì vậy, dường như đây là cách để có được hành vi giống như trang trí trong các phiên bản trước trang trí của Python, nhưng làm thế nào mà nó có thể hoạt động?

Trả lời

11

Cú pháp trang trí được cung cấp bởi PyProtocols. Cuối cùng, điều quan trọng cần lưu ý là những người trang trí "ma thuật" này sử dụng một hack rất lén lút: họ lạm dụng móc sys.settrace() trình gỡ lỗi để theo dõi xem các bài tập có đang diễn ra hay không. điều này, nhưng chức năng hiện tại của hook sẽ không thay đổi trong 2.2, 2.3 hoặc 2.4, do đó, đừng lo lắng về nó quá nhiều.Đây thực sự là một mẹo để có được "truy cập sớm" để trang trí, và vòng đời 2.4 Sẽ có rất nhiều thời gian để mã của chúng tôi được chuyển sang cú pháp 2.4. Một nơi nào đó xung quanh Python 2.5 hoặc 2.6, add_assignment_advisor() có thể thả phần ma thuật và chỉ là một trình bao tương thích ngược cho các trang trí sử dụng. "" " http://dirtsimple.org/2004/11/using-24-decorators-with-22-and-23.html

Vì vậy, nó có vẻ giống như những công việc này bằng cách gói trang trí thực tế trong một số ma thuật mà móc vào mã đặc biệt cho các trình gỡ rối để thao tác những gì thực sự được gán cho hàm.

Các tài liệu python nói điều này về settrace

""" Note Các settrace() chức năng chỉ dành cho việc thực hiện gỡ rối, profilers, công cụ bảo hiểm và những thứ tương tự. Hành vi của nó là một phần của nền tảng thực hiện, thay vì một phần của định nghĩa ngôn ngữ và do đó có thể không có sẵn trong tất cả các triển khai Python. "" "

-2

Không có gì bí ẩn, nó chỉ là cú pháp trước đây.

Trình phân tích cú pháp đã thay đổi, có thể là do Zen Zen tuyên bố rằng "Đối mặt với sự mơ hồ, từ chối sự cám dỗ để đoán."

[] chỉ dành cho danh sách và có nó.

+0

Tôi đang xem mã mà trình phân tích cú pháp Python 2.5 của tôi đang phân tích cú pháp. Khi tôi thử sử dụng kiểu cú pháp này để khai báo một trang trí trong python, nó chỉ tạo một đối tượng danh sách với một mục. Phiên bản Python nào sử dụng cú pháp này? Tôi có thể xem tài liệu ở đâu? –

+2

-1, nó là một triển khai bên ngoài cho các phiên bản Python cũ hơn, nhưng nó không phải là cú pháp. – orip

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