2012-12-09 32 views
33

Tôi đã trải qua một vài phần đầu tiên trong PEP 3107, nhưng tôi vẫn không nhận được những gì họ làm tốt cho ngôn ngữ. Dường như với tôi rằng bạn có thể thêm siêu dữ liệu vào các chức năng bằng cách sử dụng trang trí. ví dụ.Chú thích hàm Python là gì?

def returns(return_type): 
    f.return_type = return_type # <- adding metadata here 
    return f 

@returns(Foo) 
def make_foo(): ... 

Bạn có thể thêm siêu dữ liệu để lập luận quá, và nó có thể trông khá nếu bạn tận dụng lợi thế của các đối số mặc định, như vậy:

import inspect 

def defaults_are_actually_metadata(f): 
    names, args_name, kwargs_name, defaults = inspect.getfuncspec(f) 
    f.parameter_metadata = dict(zip(names[-len(defaults):], defaults)) 
    f.__defaults__ =() 
    return f 

@defaults_are_actually_metadata 
def haul(load="Stuff to be carried.", 
     speed_mph="How fast to move the load (in miles per hour)."): ... 

Ít nhất ấn tượng ban đầu của tôi là chú thích là không cần thiết: trang trí có thể làm mọi thứ mà chú thích có thể (và nhiều hơn nữa). Tại sao các chú thích lại tốt hơn các trình trang trí khi nói đến việc thêm siêu dữ liệu vào các hàm?

+4

Hiện tại, chú thích là loại thử nghiệm và loại công việc đang được tiến hành. Thực ra, có một chuỗi gần đây trong [danh sách gửi thư python-ideas] (http: //mail.python) .org/pipermail/python-ideas/2012-December/thread.html) về chủ đề có thể hữu ích –

+0

@JohnY Tôi muốn đánh dấu câu trả lời là "đúng", nhưng nó không phải là câu trả lời "chính thức"! – allyourcode

Trả lời

31

Như bạn đã đề cập, PEP có liên quan là 3107 (được liên kết để dễ tham khảo trong trường hợp những người khác gặp phải câu hỏi này chưa đọc).

Hiện tại, chú thích là loại thử nghiệm và loại công việc đang được tiến hành. Trên thực tế, có một chủ đề gần đây trong số python-ideas mailing list về chủ đề có thể hữu ích. (Liên kết được cung cấp chỉ dành cho lưu trữ hàng tháng, tôi thấy rằng URL cho các bài đăng cụ thể có xu hướng thay đổi định kỳ. Chủ đề được đề cập gần đầu tháng 12 và có tiêu đề "Các ý tưởng về Python" cho chú thích hàm ". bài đầu tiên là từ Thomas Kluyver on Dec 1.)

Dưới đây là một chút từ một trong những bài viết Guido van Rossum trong chủ đề đó:

ngày 12/4/2012 11:43, Jasper St.Pierre đã viết:

Thật vậy. Tôi đã xem các chú thích trước đây, nhưng tôi chưa bao giờ hiểu mục đích của . Dường như một tính năng được thiết kế và triển khai mà không có mục tiêu nào đó trong tâm trí và nơi cộng đồng được cho là tự mình khám phá mục tiêu .

phản ứng của Guido:

Ngược lại. Có quá nhiều trường hợp sử dụng ngay lập tức trông có vẻ quan trọng, và chúng tôi không thể tìm ra cái nào là quan trọng nhất hoặc cách kết hợp chúng, vì vậy chúng tôi quyết định thực hiện hai bước cách tiếp cận: ở bước 1, chúng tôi thiết kế cú pháp, trong khi ở bước 2, chúng tôi sẽ thiết kế ngữ nghĩa. Ý tưởng rất rõ ràng rằng khi cú pháp được giải quyết, mọi người sẽ được tự do thử nghiệm với các ngữ nghĩa khác nhau - không phải trong stdlib. Ý tưởng cũng là cuối cùng, , từ tất cả các thử nghiệm đó, một ý tưởng sẽ xuất hiện là phù hợp với stdlib.

Jasper St. Pierre:

Vì vậy, nếu tôi có thể yêu cầu, mục tiêu ban đầu của chú thích là gì? PEP cung cấp cho một số đề xuất nhưng không để lại bất kỳ điều gì cụ thể. Nó được thiết kế để được trợ giúp cho các IDE hoặc các công cụ phân tích tĩnh kiểm tra mã nguồn? Cái gì đó cho các ứng dụng tự xáo trộn để cung cấp các hành vi đặc biệt, như trình phân tích cú pháp dòng lệnh hoặc trình kiểm tra tĩnh thời gian chạy?

Guido của phản ứng:

Khá nhiều tất cả những điều trên một mức độ nào. Nhưng đối với cá nhân tôi, mục tiêu chính là luôn luôn đi đến một ký hiệu để xác định loại ràng buộc (và có thể ràng buộc khác) cho các đối số và trả về giá trị. Tôi đã chơi đùa vào những thời điểm khác nhau với những cách cụ thể kết hợp các loại . Ví dụ. list [int] có thể có nghĩa là một danh sách các số nguyên, và dict [str, tuple [float, float, float, bool]] có thể có nghĩa là một chuỗi ánh xạ dict tới tuple của ba float và một bool. Nhưng tôi cảm thấy khó khăn hơn để nhận được sự nhất trí về ký hiệu như vậy so với cú pháp đối số chú thích (suy nghĩ về số lượng phản đối mà bạn có thể mang đến cho các ví dụ sau :-) - Tôi luôn có một mong muốn sử dụng "var: type = mặc định" và để làm cho loại biểu thức thời gian chạy được đánh giá cùng lúc với mặc định.

Và một chút hài hước từ Ned Batchelder:

Một khoảnh khắc đặc đối với tôi là trong một bài phát biểu Py3k sớm tại PyCon (? Có lẽ đó là tại Dallas hoặc Chicago), Guido couldn' hãy nhớ từ "chú thích" và nói "bạn biết đấy, những điều đó không phải là loại khai báo ?":-)

8

Tôi nghĩ rằng đoạn đầu tiên khẳng định nó tất cả:

Bởi vì loạt 2.x Python của thiếu chuẩn cách chú thích các thông số của một hàm số và giá trị trả

(tôi nhấn mạnh)

Có cách tiêu chuẩn để thực hiện việc này có lợi thế là bạn biết chính xác vị trí của chú thích.

Đối với lập luận của bạn về có một cách khác để làm điều đó, bạn có thể đưa ra lập luận tương tự chống lại comprehensions danh sách:

out = [] 
for x in my_iterable: 
    out.append(x) 
6

Họ có hai vai trò khác nhau.

Chú thích là tài liệu/nhận xét cho đối số trong khi người trang trí chuyển đổi chức năng.

Bản thân, Python không kèm theo ý nghĩa hoặc ý nghĩa cụ thể nào đối với chú thích.

Python Decorators page

trang trí tự động thay đổi các chức năng của một chức năng, phương pháp, hoặc lớp mà không cần phải trực tiếp sử dụng các lớp con hoặc thay đổi mã nguồn của hàm được trang trí.

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