Hướng dẫn này giải thích Python Docstring là gì và cách sử dụng nó để ghi lại các hàm Python với các ví dụ
Các hàm rất quan trọng trong Python đến mức Python có hàng chục hàm tích hợp sẵn. Python cũng cho chúng ta khả năng tạo các hàm của riêng mình
Tuy nhiên, các chức năng không chỉ dừng lại ở việc tạo ra chúng, chúng ta phải ghi lại chúng để chúng rõ ràng, dễ đọc và dễ bảo trì. Ngoài ra, các chức năng có các thuộc tính có thể được sử dụng để xem xét nội tâm và điều này cho phép chúng tôi xử lý các chức năng theo nhiều cách khác nhau
=> Đọc qua loạt bài đào tạo Python dễ dàng
Bạn sẽ học được gì
Chuỗi tài liệu Python
Trong phần này, chúng ta sẽ xem nhanh hàm là gì và điều này đã được trình bày đầy đủ trong Hàm Python
Các hàm giống như các chương trình nhỏ trong một chương trình và nhóm một loạt các câu lệnh để chúng có thể được sử dụng và tái sử dụng trong các phần khác nhau của chương trình
Các câu lệnh liên quan đến chức năng Python với ví dụ về mã
Câu lệnh Mã mẫu Ví dụdef, tham số, returndef add[a, b=1, *args, **kwargs]. trả về a + b + tổng [args] + tổng [kwargs. values[]]callsadd[3,4,5, 9, c=1, d=8] # Đầu ra. 30
Tài liệu Một chức năng
Hầu hết chúng ta thấy khó ghi lại các chức năng của mình vì nó có thể tốn thời gian và nhàm chán
Tuy nhiên, mặc dù không ghi lại mã của chúng tôi, nhìn chung, có vẻ ổn đối với các chương trình nhỏ, nhưng khi mã trở nên phức tạp và lớn hơn, sẽ khó hiểu và khó bảo trì
Phần này khuyến khích chúng tôi luôn ghi lại các chức năng của mình cho dù chương trình của chúng tôi có vẻ nhỏ đến đâu
Tầm quan trọng của tài liệu chức năng
Có câu nói rằng “Chương trình phải được viết ra để con người đọc, và chỉ tình cờ để máy thực thi”
Chúng tôi không thể nhấn mạnh rằng việc ghi lại các chức năng của chúng tôi sẽ giúp các nhà phát triển khác [bao gồm cả chính chúng tôi] dễ dàng hiểu và đóng góp vào mã của chúng tôi
Tôi cá là chúng ta đã từng bắt gặp một đoạn mã mà chúng ta đã viết cách đây nhiều năm và chúng ta giống như “Tôi đang nghĩ gì vậy. ” Điều này là do không có tài liệu nhắc nhở chúng tôi về những gì mã đã làm và nó đã làm như thế nào
Điều đó đang được nói, nói chung, ghi lại các chức năng hoặc mã của chúng tôi mang lại những lợi ích sau
- Thêm nhiều ý nghĩa hơn cho mã của chúng tôi, do đó làm cho nó rõ ràng và dễ hiểu
- dễ dàng bảo trì. Với tài liệu phù hợp, chúng tôi có thể quay lại mã của mình nhiều năm sau và vẫn có thể duy trì mã nhanh chóng
- Dễ dàng đóng góp. Trong một dự án mã nguồn mở, ví dụ: nhiều nhà phát triển làm việc đồng thời trên cơ sở mã. Tài liệu kém hoặc không có sẽ không khuyến khích các nhà phát triển đóng góp cho các dự án của chúng tôi.
- Nó cho phép các công cụ sửa lỗi phổ biến của IDE hỗ trợ chúng tôi một cách hiệu quả trong quá trình phát triển của chúng tôi
Tài liệu chức năng với Python Docstrings
Theo
“Chuỗi tài liệu là một chuỗi ký tự xuất hiện dưới dạng câu lệnh đầu tiên trong định nghĩa mô-đun, hàm, lớp hoặc phương thức. Một chuỗi tài liệu như vậy trở thành thuộc tính đặc biệt __doc__ của đối tượng. ”
Các tài liệu được định nghĩa với định dạng chuỗi triple-double quote[“””]. Ở mức tối thiểu, một chuỗi tài liệu Python sẽ đưa ra một bản tóm tắt nhanh về bất kỳ chức năng nào đang thực hiện
Chuỗi tài liệu của hàm có thể được truy cập theo hai cách. Trực tiếp thông qua thuộc tính đặc biệt __doc__ của hàm hoặc sử dụng hàm tích hợp để truy cập __doc__ đằng sau mui xe
Ví dụ 1. Truy cập chuỗi tài liệu của hàm thông qua thuộc tính đặc biệt __doc__ của hàm.
def add[a, b]: """Return the sum of two numbers[a, b]""" return a + b if __name__ == '__main__': # print the function's docstring using the object’s special __doc__ attribute print[add.__doc__]
đầu ra
NB. Chuỗi tài liệu ở trên đại diện cho chuỗi tài liệu một dòng. Nó xuất hiện trong một dòng và tóm tắt những gì chức năng làm
Ví dụ 2. Truy cập chuỗi tài liệu của hàm bằng cách sử dụng hàm help[] tích hợp.
Chạy lệnh sau từ thiết bị đầu cuối Python Shell
>>> help[sum] # access docstring of sum[]
đầu ra
NB. Nhấn q để thoát khỏi màn hình này
Chuỗi tài liệu Python nhiều dòng kỹ lưỡng hơn và có thể chứa tất cả những điều sau đây
- Mục đích của chức năng
- Thông tin về lập luận
- Thông tin về dữ liệu trả về
Bất kỳ thông tin nào khác có vẻ hữu ích đối với chúng tôi
Ví dụ dưới đây cho thấy một cách toàn diện về tài liệu chức năng của chúng tôi. Nó bắt đầu bằng cách đưa ra một bản tóm tắt ngắn về chức năng của hàm và một dòng trống theo sau là giải thích chi tiết hơn về mục đích của hàm, sau đó một dòng trống khác theo sau là thông tin về đối số, giá trị trả về và bất kỳ ngoại lệ nào nếu có
Chúng tôi cũng nhận thấy một khoảng cách ngắt sau dấu ngoặc kép kèm theo trước phần thân của chức năng của chúng tôi
ví dụ 3
def add_ages[age1, age2=30]: """ Return the sum of ages Sum and return the ages of your son and daughter Parameters ------------ age1: int The age of your son age2: int, Optional The age of your daughter[default to 30] Return ----------- age : int The sum of your son and daughter ages. """ age = age1 + age2 return age if __name__ == '__main__': # print the function's docstring using the object's special __doc__ attribute print[add_ages.__doc__]
đầu ra
NB. Đây không phải là cách duy nhất để ghi tài liệu bằng docstring. Đọc về các định dạng khác quá
Định dạng chuỗi tài liệu Python
Định dạng chuỗi tài liệu được sử dụng ở trên là định dạng kiểu NumPy/SciPy. Các định dạng khác cũng tồn tại, chúng tôi cũng có thể tạo định dạng của mình để công ty của chúng tôi hoặc nguồn mở sử dụng. Tuy nhiên, thật tốt khi sử dụng các định dạng nổi tiếng được tất cả các nhà phát triển công nhận
Một số định dạng nổi tiếng khác là , reStructuredText, Epytext
Ví dụ 4. Bằng cách tham chiếu mã từ ví dụ 3, hãy sử dụng định dạng chuỗi tài liệu Google docstrings, reStructuredText và Epytext để viết lại chuỗi tài liệu.
#1] Tài liệu của Google
"""Return the sum of ages Sum and return the ages of your son and daughter Args: age1 [int]: The age of your son age2 [int]: Optional; The age of your daughter [ default is 30] Returns: age [int]: The sum of your son and daughter ages. """
#2] Tái cấu trúc văn bản
"""Return the sum of ages Sum and return the ages of your son and daughter :param age1: The age of your son :type age1: int :param age2: Optional; The age of your daughter [ default is 30] :type age2: int :returns age: The sum of your son and daughter ages. :rtype: int """
#3] Văn bản
"""Return the sum of ages Sum and return the ages of your son and daughter @type age1: int @param age1: The age of your son @type age2: int @param age2: Optional; The age of your daughter [ default is 30] @rtype: int @returns age: The sum of your son and daughter ages. """
Cách các công cụ khác sử dụng DocStrings
Hầu hết các công cụ như trình chỉnh sửa mã, IDE, v.v. đều sử dụng các chuỗi tài liệu để cung cấp cho chúng tôi một số chức năng có thể giúp chúng tôi phát triển, gỡ lỗi và thử nghiệm
Trình chỉnh sửa mã
Các trình chỉnh sửa mã như Visual Studio Code với tiện ích mở rộng Python được cài đặt có thể hỗ trợ chúng tôi hiệu quả và tốt hơn trong quá trình phát triển nếu chúng tôi ghi lại chính xác các chức năng và lớp của mình bằng chuỗi tài liệu
Ví dụ 5
Mở Visual Studio Code đã cài đặt tiện ích mở rộng Python, sau đó lưu mã của ví dụ 2 dưới dạng ex2_dd_ages. py. Trong cùng thư mục, tạo tệp thứ hai có tên ex3_import_ex2. py và dán vào đó mã bên dưới
from ex2_add_ages import add_ages # import result = add_ages[4,5] # execute print[result]
Chúng ta đừng chạy mã này mà hãy di chuột [đặt chuột lên] add_ages trong trình chỉnh sửa của chúng ta
Chúng ta sẽ thấy chuỗi tài liệu của hàm như trong hình bên dưới
Chúng tôi thấy rằng điều này giúp chúng tôi có bản xem trước về những gì hàm làm, những gì nó mong đợi ở dạng đầu vào và cả những gì mong đợi ở dạng giá trị trả về từ hàm mà không cần kiểm tra hàm ở bất kỳ đâu mà nó đã được xác định
Mô-đun thử nghiệm
Python có một mô-đun thử nghiệm gọi là doctest. Nó tìm kiếm các đoạn văn bản chuỗi tài liệu bắt đầu bằng tiền tố >>>[đầu vào từ trình bao Python] và thực thi chúng để xác minh rằng chúng hoạt động và tạo ra kết quả chính xác như mong đợi
Điều này cung cấp một cách nhanh chóng và dễ dàng để viết các bài kiểm tra cho các chức năng của chúng tôi
Ví dụ 6
def add_ages[age1, age2= 30]: """ Return the sum of ages Sum and return the ages of your son and daughter Test ----------- >>> add_ages[10, 10] 20 """ age = age1 + age2 return age if __name__ == '__main__': import doctest doctest.testmod[] # run test
Trong chuỗi tài liệu ở trên, bài kiểm tra của chúng tôi được đặt trước >>> và bên dưới nó là kết quả mong đợi, trong trường hợp này là 20
Hãy lưu mã ở trên dưới dạng ex4_test. py và chạy nó từ terminal bằng lệnh
________số 8đầu ra
Chức năng chú thích
Ngoài các chuỗi tài liệu, Python cho phép chúng ta đính kèm siêu dữ liệu vào các tham số và giá trị trả về của hàm, được cho là đóng vai trò quan trọng trong tài liệu hàm và kiểm tra kiểu. Điều này được gọi là Chú thích chức năng được giới thiệu trong PEP 3107
cú pháp
def [: expression, : expression = ]-> expression
Ví dụ, hãy xem xét một hàm làm tròn số float thành số nguyên
Từ hình trên, các chú thích của chúng tôi ngụ ý rằng loại đối số mong muốn phải nổi và loại trả về mong đợi phải là một số nguyên
Thêm chú thích
Có hai cách để thêm chú thích vào một chức năng. Cách đầu tiên như đã thấy ở trên, nơi các chú thích đối tượng được gắn vào tham số và giá trị trả về
Cách thứ hai là thêm chúng thủ công thông qua thuộc tính __annotations__
Ví dụ 7
>>> help[sum] # access docstring of sum[]0
đầu ra
NB. Tra từ điển ta thấy tên tham số được dùng làm khóa cho tham số và chuỗi ‘return’ được dùng làm khóa cho giá trị trả về
Nhớ lại từ cú pháp trên rằng các chú thích có thể là bất kỳ biểu thức hợp lệ nào
Vì vậy, nó có thể là
- Một chuỗi mô tả đối số dự kiến hoặc giá trị trả về
- Các loại dữ liệu khác như Danh sách, Từ điển, v.v.
Ví dụ 8. Xác định các chú thích khác nhau
>>> help[sum] # access docstring of sum[]1
đầu ra
Truy cập chú thích
Trình thông dịch Python tạo một từ điển chú thích của hàm và đưa chúng vào thuộc tính đặc biệt __annotations__ của hàm. Vì vậy, truy cập các chú thích cũng giống như truy cập các mục từ điển
Ví dụ 9. Truy cập chú thích của hàm.
>>> help[sum] # access docstring of sum[]2
đầu ra
NB. Nếu một tham số lấy một giá trị mặc định, thì nó phải xuất hiện sau chú thích
Sử dụng chú thích
Bản thân chú thích không làm được gì nhiều. Trình thông dịch Python không sử dụng nó để áp đặt bất kỳ hạn chế nào. Chúng chỉ là một cách khác để ghi lại một chức năng
Ví dụ 10. Truyền đối số thuộc loại khác với chú thích.
>>> help[sum] # access docstring of sum[]3
đầu ra
Chúng tôi thấy rằng trình thông dịch Python không đưa ra một ngoại lệ hoặc cảnh báo nào
Mặc dù vậy, các chú thích có thể được sử dụng để hạn chế các đối số kiểu dữ liệu. Nó có thể được thực hiện theo nhiều cách nhưng trong hướng dẫn này, chúng ta sẽ định nghĩa một trình trang trí sử dụng các chú thích để kiểm tra các kiểu dữ liệu đối số
Ví dụ 11. Sử dụng chú thích trong trang trí để kiểm tra kiểu dữ liệu đối số.
Đầu tiên, hãy xác định trang trí của chúng tôi
>>> help[sum] # access docstring of sum[]4
NB. Chức năng trên là một trang trí
Cuối cùng, hãy xác định chức năng của chúng tôi và sử dụng trình trang trí để kiểm tra bất kỳ loại dữ liệu đối số nào
>>> help[sum] # access docstring of sum[]5
đầu ra
Từ kết quả ở trên, chúng ta thấy rằng lệnh gọi hàm đầu tiên được thực thi thành công, nhưng lệnh gọi hàm thứ hai đưa ra một dấu hiệu cho biết rằng các mục trong đối số thứ ba không tôn trọng kiểu dữ liệu được chú thích. Yêu cầu tất cả các mục trong danh sách đối số thứ ba là kiểu float
Nội quan chức năng
Các đối tượng chức năng có nhiều thuộc tính có thể được sử dụng để xem xét nội quan. Để xem tất cả các thuộc tính này, chúng ta có thể sử dụng hàm dir[] như hình bên dưới
Ví dụ 13. In ra các thuộc tính của hàm.
>>> help[sum] # access docstring of sum[]6
đầu ra
NB. Hình trên là các thuộc tính của các hàm do người dùng định nghĩa có thể hơi khác so với các hàm và đối tượng lớp tích hợp
Trong phần này, chúng ta sẽ xem xét một số thuộc tính có thể giúp chúng ta xem xét nội hàm
Các thuộc tính của hàm do người dùng định nghĩa
AttributeDescriptionState__dict__Một từ điển hỗ trợ các thuộc tính chức năng tùy ý. Writable__closure__A Không có hoặc bộ ô chứa các liên kết cho các biến tự do của hàm. Read-Only__code__Bytecode đại diện cho siêu dữ liệu hàm đã biên dịch và thân hàm. Writable__defaults__Một bộ chứa các giá trị mặc định cho các đối số mặc định hoặc Không có nếu không có đối số mặc định. Writable__kwdefaults__Một lệnh chứa các giá trị mặc định cho các tham số chỉ từ khóa. Writable__name__A str là tên hàm. Writable__qualname__A str là tên đủ điều kiện của hàm. Có thể ghi
Chúng tôi không bao gồm __annotations__ trong bảng trên vì chúng tôi đã giải quyết nó trước đó trong hướng dẫn này. Hãy xem kỹ một số thuộc tính được trình bày trong bảng trên
#1] chính tả
Python sử dụng thuộc tính __dict__ của hàm để lưu trữ các thuộc tính tùy ý được gán cho hàm
Nó thường được gọi là một dạng chú thích nguyên thủy. Mặc dù nó không phải là một thông lệ phổ biến, nhưng nó có thể trở nên hữu ích cho tài liệu
Ví dụ 14. Gán thuộc tính tùy ý cho hàm mô tả chức năng của hàm.
>>> help[sum] # access docstring of sum[]7
đầu ra
#2] Đóng Python
Việc đóng cho phép một hàm lồng nhau có quyền truy cập vào một biến miễn phí của hàm kèm theo của nó
Nhà bị tịch thu để xảy ra, ba điều kiện cần phải được đáp ứng
- Nó phải là một chức năng lồng nhau
- Hàm lồng nhau có quyền truy cập vào các biến hàm kèm theo của nó [biến tự do]
- Hàm kèm theo trả về hàm lồng nhau
Ví dụ 15. Minh họa việc sử dụng bao đóng trong các hàm lồng nhau.
Hàm kèm theo [divide_by] nhận một ước số và trả về một hàm lồng nhau [cổ tức] nhận cổ tức và chia nó cho ước số
Mở trình chỉnh sửa, dán mã bên dưới và lưu dưới dạng đóng. py
>>> help[sum] # access docstring of sum[]8
đầu ra
Vì vậy, việc sử dụng __closure__ là gì. Thuộc tính này trả về một bộ đối tượng ô xác định thuộc tính cell_contents chứa tất cả các biến của hàm kèm theo
Ví dụ 16. Trong thư mục đóng cửa. py đã được lưu, hãy mở terminal và khởi động trình bao Python bằng lệnh python và thực thi mã bên dưới.
>>> help[sum] # access docstring of sum[]9
NB. __closure__ trả về Không nếu nó không phải là hàm lồng nhau
#3] mã, mặc định, kwdefault, Tên, tên chất lượng
__name__ trả về tên của hàm và __qualname__ trả về tên đủ điều kiện. Tên đủ điều kiện là tên có dấu chấm mô tả đường dẫn chức năng từ phạm vi toàn cầu của mô-đun của nó. Đối với các chức năng cấp cao nhất, __qualname__ giống như __name__
Ví dụ 17. Trong thư mục đóng cửa. py trong ví dụ 15 đã được lưu, hãy mở terminal và khởi động trình bao Python bằng lệnh python và thực thi mã bên dưới.
def add_ages[age1, age2=30]: """ Return the sum of ages Sum and return the ages of your son and daughter Parameters ------------ age1: int The age of your son age2: int, Optional The age of your daughter[default to 30] Return ----------- age : int The sum of your son and daughter ages. """ age = age1 + age2 return age if __name__ == '__main__': # print the function's docstring using the object's special __doc__ attribute print[add_ages.__doc__]0
__defaults__ chứa các giá trị của tham số mặc định của hàm trong khi __kwdefaults__ chứa từ điển các tham số và giá trị chỉ từ khóa của hàm
__code__ xác định các thuộc tính co_varnames chứa tên của tất cả các tham số của hàm và co_argcount chứa số lượng tham số của hàm ngoại trừ các tham số có tiền tố * và **
Ví dụ 18
def add_ages[age1, age2=30]: """ Return the sum of ages Sum and return the ages of your son and daughter Parameters ------------ age1: int The age of your son age2: int, Optional The age of your daughter[default to 30] Return ----------- age : int The sum of your son and daughter ages. """ age = age1 + age2 return age if __name__ == '__main__': # print the function's docstring using the object's special __doc__ attribute print[add_ages.__doc__]1
đầu ra
NB
- Tất cả các tham số mặc định sau dấu * trống trở thành tham số chỉ từ khóa [mới trong Python 3]
- co_argcount đếm 2 vì nó không xem xét bất kỳ biến đối số nào có tiền tố là * hoặc **
Các câu hỏi thường gặp
Q #1] Python có thực thi các gợi ý kiểu không?
Câu trả lời. Trong Python, bản thân các gợi ý gõ không làm được gì nhiều. Chúng chủ yếu được sử dụng để thông báo cho người đọc về loại mã mà một biến được mong đợi. Tin tốt là thông tin của nó có thể được sử dụng để thực hiện kiểm tra kiểu. Điều này thường được thực hiện trong trình trang trí Python
Q #2] Docstring trong Python là gì?
Câu trả lời. Chuỗi tài liệu là chuỗi ký tự đầu tiên được đặt trong dấu ngoặc kép ba lần [“””] và ngay sau định nghĩa của một lớp, mô-đun hoặc hàm. Một chuỗi tài liệu thường mô tả những gì đối tượng đang làm, các tham số và giá trị trả về của nó
Câu hỏi 3] Làm cách nào để bạn có được Chuỗi tài liệu Python?
Câu trả lời. Nói chung, có hai cách để lấy chuỗi tài liệu của đối tượng. Bằng cách sử dụng thuộc tính đặc biệt của đối tượng __doc__ hoặc bằng cách sử dụng hàm help[] tích hợp sẵn
Q #4] Làm thế nào để bạn viết một Docstring tốt?
Câu trả lời. PEP 257 chứa các quy ước Docstring chính thức. Ngoài ra, các định dạng nổi tiếng khác tồn tại như kiểu Numpy/SciPy, Google docstrings, ReStructured Text, Epytext
Phần kết luận
Trong hướng dẫn này, chúng ta đã xem xét tài liệu chức năng nơi chúng ta thấy tầm quan trọng của việc ghi lại các chức năng của mình và cũng học cách chúng ta có thể lập tài liệu bằng docstring
Chúng tôi cũng đã xem xét nội quan chức năng trong đó chúng tôi đã kiểm tra một số thuộc tính chức năng có thể được sử dụng để xem xét nội quan