Định dạng tiêu đề phổ biến của các tệp Python là gì?


508

Tôi đã xem qua định dạng tiêu đề sau cho các tệp nguồn Python trong một tài liệu về hướng dẫn mã hóa Python:

#!/usr/bin/env python

"""Foobar.py: Description of what foobar does."""

__author__      = "Barack Obama"
__copyright__   = "Copyright 2009, Planet Earth"

Đây có phải là định dạng chuẩn của các tiêu đề trong thế giới Python không? Những lĩnh vực / thông tin nào khác tôi có thể đặt trong tiêu đề? Các chuyên gia về Python chia sẻ các nguyên tắc của bạn cho các tiêu đề nguồn Python tốt :-)


Đây là một nơi tốt để bắt đầu: PEP 257 , nói về Docstrings và liên kết đến một số tài liệu liên quan khác.
Peter

41
Có lẽ một hướng dẫn hữu ích cho những người đọc các câu trả lời khác nhau cho câu hỏi này là xem xét mục đích mà họ mong đợi các tiêu đề tệp này sẽ được sử dụng cho mục đích gì. Nếu bạn có một trường hợp sử dụng cụ thể (ví dụ luật sư của tôi nói rằng các trường hợp tòa án bị mất vì các nhà phát triển không đưa thông tin bản quyền vào mỗi tệp.) Sau đó thêm và duy trì thông tin bạn cần cho trường hợp sử dụng đó. Nếu không, bạn chỉ cần nuông chiều sự tôn sùng OCD của bạn.
Jonathan Hartley

haha tuyệt vời @JonathanHartley! Đối với các dự án của riêng tôi, như bạn nói, "Tôi thưởng thức sự tôn sùng OCD của mình." hahaaha stackoverflow.com/a/51914806/1896134
JayRizzo

Câu trả lời:


577

Tất cả siêu dữ liệu của nó cho các Foobarmô-đun.

Cái đầu tiên là docstringmô-đun, đã được giải thích trong câu trả lời của Peter .

Làm cách nào để tổ chức các mô-đun của tôi (tệp nguồn)? (Lưu trữ)

Dòng đầu tiên của mỗi tập tin shoud được #!/usr/bin/env python. Điều này làm cho nó có thể chạy tệp dưới dạng một tập lệnh gọi trình thông dịch ngầm, ví dụ như trong ngữ cảnh CGI.

Tiếp theo nên là chuỗi doc với một mô tả. Nếu mô tả dài, dòng đầu tiên phải là một bản tóm tắt ngắn có ý nghĩa riêng, tách biệt với phần còn lại bằng một dòng mới.

Tất cả các mã, bao gồm các câu lệnh nhập, phải tuân theo chuỗi doc. Mặt khác, chuỗi doc sẽ không được trình thông dịch nhận ra và bạn sẽ không có quyền truy cập vào nó trong các phiên tương tác (tức là thông qua obj.__doc__) hoặc khi tạo tài liệu bằng các công cụ tự động.

Trước tiên, nhập các mô-đun tích hợp, tiếp theo là các mô-đun của bên thứ ba, theo sau là bất kỳ thay đổi nào đối với đường dẫn và các mô-đun của riêng bạn. Đặc biệt, các bổ sung cho đường dẫn và tên của các mô-đun của bạn có thể sẽ thay đổi nhanh chóng: giữ chúng ở một nơi giúp chúng dễ dàng tìm thấy hơn.

Tiếp theo nên là thông tin về quyền tác giả. Thông tin này phải theo định dạng này:

__author__ = "Rob Knight, Gavin Huttley, and Peter Maxwell"
__copyright__ = "Copyright 2007, The Cogent Project"
__credits__ = ["Rob Knight", "Peter Maxwell", "Gavin Huttley",
                    "Matthew Wakefield"]
__license__ = "GPL"
__version__ = "1.0.1"
__maintainer__ = "Rob Knight"
__email__ = "rob@spot.colorado.edu"
__status__ = "Production"

Trạng thái thường là một trong "Nguyên mẫu", "Phát triển" hoặc "Sản xuất". __maintainer__nên là người sẽ sửa lỗi và cải thiện nếu được nhập. __credits__khác với __author__trong đó __credits__bao gồm những người báo cáo sửa lỗi, đưa ra đề xuất, v.v. nhưng không thực sự viết mã.

Ở đây bạn có thêm thông tin, niêm yết __author__, __authors__, __contact__, __copyright__, __license__, __deprecated__, __date____version__siêu dữ liệu như được công nhận.


7
Việc tạo thông tin tiêu đề bằng cách nào đó có thể được tự động hóa cho các tệp mới không?
Hauke

184
Tôi nghĩ rằng tất cả các siêu dữ liệu này sau khi nhập khẩu là một ý tưởng tồi. Các phần của siêu dữ liệu này áp dụng cho một tệp duy nhất (ví dụ: tác giả, ngày) đã được theo dõi bởi kiểm soát nguồn. Đặt một bản sao sai và lỗi thời của cùng một thông tin trong tệp có vẻ sai đối với tôi. Các phần áp dụng cho toàn bộ dự án (ví dụ: giấy phép, phiên bản) có vẻ tốt hơn ở cấp độ dự án, trong một tệp của riêng chúng, thay vì trong mọi tệp mã nguồn.
Jonathan Hartley

28
Đồng ý hoàn toàn với Jonathan Hartley. Người tiếp theo thừa kế mã có ba lựa chọn: 1) cập nhật tất cả mỗi lần anh ấy / cô ấy chỉnh sửa mã 2) để yên, trong trường hợp đó sẽ không chính xác 3) xóa tất cả. Tùy chọn 1 là một sự lãng phí thời gian của họ, đặc biệt là vì họ hoàn toàn không tin tưởng rằng siêu dữ liệu đã được cập nhật khi họ nhận được nó. Tùy chọn 2 và 3 có nghĩa là thời gian của bạn đặt nó ở vị trí đầu tiên đã bị lãng phí. Giải pháp: tiết kiệm thời gian của mọi người và đừng để nó ở đó.
spookylukey

77
Không có lý do gì để hầu hết các tệp Python có dòng shebang.
Mike Graham

15
Mỗi PEP 8, __version__cần phải được theo dõi trực tiếp chuỗi chính, với một dòng trống trước và sau. Ngoài ra, cách tốt nhất là xác định bộ ký tự của bạn ngay lập tức dưới shebang -# -*- coding: utf-8 -*-
Dave Lasley

179

Tôi đặc biệt ủng hộ các tiêu đề tệp tối thiểu, ý tôi là:

  • Hashbang ( #!dòng) nếu đây là tập lệnh thực thi
  • Mô-đun mô-đun
  • Nhập khẩu, được nhóm theo cách tiêu chuẩn, ví dụ:
  import os    # standard library
  import sys

  import requests  # 3rd party packages

  import mypackage.mymodule  # local source
  import mypackage.myothermodule  

I E. ba nhóm nhập khẩu, với một dòng trống duy nhất giữa chúng. Trong mỗi nhóm, nhập khẩu được sắp xếp. Nhóm cuối cùng, nhập khẩu từ nguồn địa phương, có thể là nhập tuyệt đối như được hiển thị hoặc nhập khẩu tương đối rõ ràng.

Mọi thứ khác là một sự lãng phí thời gian, không gian trực quan và chủ động gây hiểu lầm.

Nếu bạn có từ chối trách nhiệm pháp lý hoặc thông tin cấp phép, nó sẽ đi vào một tệp riêng. Nó không cần phải lây nhiễm mọi tập tin mã nguồn. Bản quyền của bạn nên là một phần của điều này. Mọi người sẽ có thể tìm thấy nó trong LICENSEtệp của bạn , không phải mã nguồn ngẫu nhiên.

Siêu dữ liệu như quyền tác giả và ngày tháng đã được duy trì bởi kiểm soát nguồn của bạn. Không cần phải thêm một phiên bản ít chi tiết, sai sót và lỗi thời của cùng một thông tin trong chính tệp.

Tôi không tin có bất kỳ dữ liệu nào khác mà mọi người cần phải đưa vào tất cả các tệp nguồn của họ. Bạn có thể có một số yêu cầu cụ thể để làm như vậy, nhưng những điều như vậy chỉ áp dụng cho bạn. Họ không có chỗ trong các tiêu đề chung được đề xuất cho mọi người.


23
Không thể đồng ý nhiều hơn - thật là tội lỗi khi sao chép mã ở nhiều nơi, vậy tại sao lại làm như vậy đối với thông tin tiêu đề. Đặt nó ở một nơi duy nhất (gốc dự án) và tránh những rắc rối trong việc duy trì thông tin đó trên nhiều, nhiều tệp.
Graeme

13
Mặc dù tôi đồng ý rằng kiểm soát nguồn có xu hướng cung cấp thông tin về quyền tác giả hợp lệ hơn, đôi khi các tác giả chỉ phân phối nguồn mà không cấp quyền truy cập vào kho lưu trữ hoặc có thể đó chỉ là cách phân phối hoạt động, ví dụ: cài đặt tập trung từ pypi. Do đó, việc nhúng thông tin quyền tác giả như một tiêu đề mô-đun vẫn có lợi.
pram

6
Này Pram. Tôi gặp khó khăn khi dự tính một trường hợp sử dụng thực sự hữu ích. Tôi có thể tưởng tượng ai đó muốn biết thông tin về quyền tác giả cho toàn bộ dự án và họ có thể nhận được giá trị từ danh sách những người đóng góp chính ở một vị trí trung tâm duy nhất, có thể là README hoặc tài liệu của dự án. Nhưng ai sẽ (a) muốn biết quyền tác giả của các tệp riêng lẻ và (b) sẽ không có quyền truy cập vào repo nguồn và (c) sẽ không quan tâm rằng không bao giờ có cách nào để biết thông tin không chính xác hay hết hạn?
Jonathan Hartley

12
Nhiều giấy phép yêu cầu bạn bao gồm bản tóm tắt giấy phép trong mỗi tệp vì một lý do rất chính đáng. Nếu ai đó lấy một hoặc hai tệp và phân phối lại mà không có giấy phép, những người nhận được nó sẽ không biết giấy phép đó thuộc về giấy phép nào và sẽ phải truy tìm nó (giả sử họ có đức tin tốt).
nyuszika7h

3
__version__Mặc dù vậy, rất nhiều mô-đun (scipy, numpy, matplotlib) có siêu dữ liệu và tôi nghĩ rằng nó tốt để có, vì nó có thể truy cập được vào các chương trình và kiểm tra nhanh trong trình thông dịch tương tác. Quyền tác giả và thông tin pháp lý thuộc về một tập tin khác, mặc dù. Trừ khi bạn có trường hợp sử dụng choif 'Rob' in __author__:
endolith

34

Các câu trả lời ở trên thực sự đầy đủ, nhưng nếu bạn muốn một tiêu đề nhanh và bẩn để sao chép, hãy sử dụng:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""Module documentation goes here
   and here
   and ...
"""

Tại sao đây là một trong những tốt:

  • Dòng đầu tiên dành cho người dùng * nix. Nó sẽ chọn trình thông dịch Python trong đường dẫn người dùng, do đó sẽ tự động chọn trình thông dịch ưa thích của người dùng.
  • Cái thứ hai là mã hóa tập tin. Ngày nay mỗi tập tin phải có một mã hóa liên quan. UTF-8 sẽ hoạt động ở mọi nơi. Chỉ cần các dự án cũ sẽ sử dụng mã hóa khác.
  • Và một tài liệu rất đơn giản. Nó có thể điền vào nhiều dòng.

Xem thêm: https://www.python.org/dev/peps/pep-0263/

Nếu bạn chỉ viết một lớp trong mỗi tệp, bạn thậm chí không cần tài liệu (nó sẽ đi vào bên trong tài liệu lớp).


5
> "Ngày nay mọi tập tin phải có mã hóa liên quan." Điều này có vẻ sai lệch. utf8 là mã hóa mặc định, vì vậy nó hoàn toàn tốt để không chỉ định nó.
Jonathan Hartley

23

Đồng thời xem PEP 263 nếu bạn đang sử dụng bộ ký tự không phải mã ascii

trừu tượng

PEP này đề xuất giới thiệu một cú pháp để khai báo mã hóa của tệp nguồn Python. Thông tin mã hóa sau đó được trình phân tích cú pháp Python sử dụng để diễn giải tệp bằng cách sử dụng mã hóa đã cho. Đáng chú ý nhất là điều này giúp tăng cường việc giải thích các chữ Unicode trong mã nguồn và cho phép viết các chữ Unicode bằng cách sử dụng trực tiếp UTF-8 trong trình soạn thảo nhận thức Unicode.

Vấn đề

Trong Python 2.1, các chữ Unicode chỉ có thể được viết bằng cách sử dụng mã hóa "unicode-esc" dựa trên Latin-1. Điều này làm cho môi trường lập trình khá không thân thiện với người dùng Python sống và làm việc ở các địa phương không phải là người Latin-1 như nhiều quốc gia châu Á. Các lập trình viên có thể viết các chuỗi 8 bit của họ bằng cách sử dụng mã hóa yêu thích, nhưng bị ràng buộc với mã hóa "unicode-esc" cho các chữ Unicode.

Giải pháp đề xuất

Tôi đề xuất làm cho mã hóa mã nguồn Python có thể nhìn thấy và thay đổi được trên cơ sở tệp trên mỗi nguồn bằng cách sử dụng một nhận xét đặc biệt ở đầu tệp để khai báo mã hóa.

Để làm cho Python biết về khai báo mã hóa này, một số thay đổi khái niệm là cần thiết đối với việc xử lý dữ liệu mã nguồn Python.

Xác định mã hóa

Python sẽ mặc định ASCII là mã hóa tiêu chuẩn nếu không có gợi ý mã hóa nào khác được đưa ra.

Để xác định mã hóa mã nguồn, một chú thích ma thuật phải được đặt vào các tệp nguồn là dòng đầu tiên hoặc thứ hai trong tệp, chẳng hạn như:

      # coding=<encoding name>

hoặc (sử dụng các định dạng được công nhận bởi các biên tập viên phổ biến)

      #!/usr/bin/python
      # -*- coding: <encoding name> -*-

hoặc là

      #!/usr/bin/python
      # vim: set fileencoding=<encoding name> :

...


15
Điều đáng chú ý là kể từ Python 3, bộ ký tự mặc định là UTF-8.
nyuszika7h
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.