Tôi có mô-đun cần có số @property
, tôi đã giải quyết điều này bằng cách đặt lớp làm mô-đun. Tôi có ý tưởng từ câu trả lời này: Lazy module variables--can it be done?Đặc tính mô-đun tài liệu Sphinx
Tôi muốn điều này có thể lặp lại và dễ sử dụng vì vậy tôi đã thực hiện một metaclass cho nó. Công việc này như một cái duyên vậy.
Vấn đề là khi sử dụng Nhân sư để tạo thuộc tính tài liệu không được ghi nhận. Mọi thứ khác được ghi lại như mong đợi. Tôi không có ý tưởng làm thế nào để sửa lỗi này, có lẽ đây là một vấn đề với Sphinx?
Module:
import sys
import types
class ClassAsModule(type):
def __new__(cls, name, bases, attrs):
# Make sure the name of the class is the module name.
name = attrs.pop('__module__')
# Create a class.
cls = type.__new__(cls, name, bases, attrs)
# Instantiate the class and register it.
sys.modules[name] = cls = cls(name)
# Update the dict so dir works properly
cls.__dict__.update(attrs)
class TestClass(types.ModuleType):
"""TestClass docstring."""
__metaclass__ = ClassAsModule
@property
def some_property(self):
"""Property docstring."""
pass
def meth():
"""meth doc"""
pass
Và một copy-paste để tạo/xem tài liệu hướng dẫn Sphinx:
sphinx-apidoc . -o doc --full
sphinx-build doc html
xdg-open html/module.html
Phần quan trọng nhất là để ghi lại các thuộc tính lớp. Điểm thưởng cũng là tài liệu thành viên mô-đun ban đầu.
CHỈNH SỬA: Lớp phải được ghi lại là mô-đun. Lớp này được sử dụng theo cách này và do đó sẽ xuất hiện theo cách này trong Sphinx.
Ví dụ về đầu ra mong muốn:
Module Foo
TestClass docstring.
some_property
Property docstring.
meth()
meth doc
EDIT 2: tôi tìm thấy một cái gì đó mà có thể hỗ trợ trong việc tìm kiếm một giải pháp. Khi có một module thường xuyên foo
với nội dung sau:
#: Property of foo
prop = 'test'
Sphinx tài liệu này như:
foo.prop = 'test'
Property of foo
Các công trình tương tự nếu prop
là một thuộc tính của một lớp. Tôi đã không tìm ra lý do tại sao nó không hoạt động trong trường hợp đặc biệt của tôi.
Mã của bạn không hoạt động. 'ModMeta' không được xác định. Bạn có thể vui lòng đăng mã làm việc không? – jterrace
@jterrace Sao chép-dán không thành công. Bây giờ là cố định ;-) – siebz0r
Đã xóa câu trả lời của tôi vì mã ban đầu của bạn có '__metaclass_' thay vì' __metaclass__', khiến nó không hoạt động. – jterrace