Có phải là thông thường để nâng cao NotIm HiệnedError cho các phương thức mà việc triển khai đang chờ xử lý, nhưng không được lên kế hoạch trừu tượng?


34

Tôi muốn đưa ra một NotImplementedErrorphương pháp cho bất kỳ phương pháp nào tôi muốn thực hiện, nhưng tôi chưa có cơ hội để thực hiện nó. Tôi có thể đã thực hiện một phần, nhưng hãy chuẩn bị trước raise NotImplementedError()vì tôi chưa thích. Mặt khác, tôi cũng thích tuân theo các quy ước, bởi vì điều này sẽ giúp người khác dễ dàng duy trì mã của tôi hơn và các quy ước có thể tồn tại vì một lý do chính đáng.

Tuy nhiên, tài liệu của Pythons cho các trạng thái NotImcellenceedError :

Ngoại lệ này có nguồn gốc từ RuntimeError. Trong các lớp cơ sở do người dùng định nghĩa, các phương thức trừu tượng sẽ đưa ra ngoại lệ này khi chúng yêu cầu các lớp dẫn xuất ghi đè lên phương thức.

Đó là một trường hợp sử dụng chính thức, cụ thể hơn nhiều so với trường hợp tôi mô tả. Đây có phải là một phong cách thông thường, tốt để nêu lên một NotImplementedErrorcách đơn giản để chỉ ra rằng phần này của API đang trong quá trình thực hiện không? Nếu không, có một cách tiêu chuẩn hóa khác để chỉ ra điều này?


Bạn có ý nghĩa gì bởi "thích hợp?"
Robert Harvey

1
@RobertHarvey Tôi cho rằng tôi có nghĩa là thông thường, theo cách sử dụng phổ biến. Tôi đã viết lại câu hỏi của tôi bây giờ.
gerrit

1
Chúng tôi sử dụng C # ở đây là chủ yếu, nhưng loại ném ngoại lệ đó là thành ngữ ở đây, và tôi sẽ mong đợi ở nơi khác. Nghỉ sớm và phá vỡ lớn là một hướng dẫn tốt để xác định các vấn đề tiềm ẩn một cách nhanh chóng (đọc: không tốn kém).
Telastyn

Nói chung, nếu tôi đang tạo một lớp, tôi chỉ cần đưa các nhận xét TODO vào các phương thức chưa được thực hiện cho đến khi tôi thực hiện được chức năng này. Nếu lớp học sẽ được phát hành để sản xuất trước khi điều đó xảy ra, tôi sẽ xem xét ném ngoại lệ.

5
Đối với những gì nó có giá trị, đây là những gì Microsoft Visual Studio làm theo mặc định khi bạn sử dụng IDE để "triển khai giao diện". Tại Robert Harvey nói, kết quả được hiểu rõ.
catfood

Câu trả lời:


34

Điều đáng chú ý là, trong khi tài liệu Python cung cấp trường hợp sử dụng (và có thể là trường hợp chính tắc) cho ngoại lệ này, thì nó không loại trừ cụ thể việc sử dụng nó trong các tình huống khác.

Tôi sẽ xem xét nó có phù hợp để đưa ra một ngoại lệ NotIm HiệnedError nếu bạn chưa ghi đè một phương thức trong lớp cơ sở (để đáp ứng "giao diện").

Một kiểm tra chữ thảo trên Google cho thấy mọi người sẽ hiểu ý của bạn nếu bạn sử dụng ngoại lệ theo cách này. Không có tác dụng phụ hoặc hậu quả không lường trước mà tôi biết; phương thức sẽ đơn giản ném một ngoại lệ nếu nó được gọi và nó sẽ ném một ngoại lệ được mọi người hiểu rõ.


Các tài liệu cho Python 3 phản ánh việc sử dụng này chính xác:

Trong các lớp cơ sở do người dùng định nghĩa, các phương thức trừu tượng sẽ đưa ra ngoại lệ này khi chúng yêu cầu các lớp dẫn xuất ghi đè lên phương thức hoặc trong khi lớp đang được phát triển để chỉ ra rằng việc triển khai thực sự vẫn cần phải được thêm vào . [Nhấn mạnh thêm]


+1, nhưng tôi cũng nói thêm rằng đối với loại quy ước này, một tài liệu nhỏ có thể đi một chặng đường dài. Giống như một ghi chú một dòng trong wiki dev, repo readme hoặc hướng dẫn về phong cách - đại loại như thế - giải thích những gì bạn sử dụng ngoại lệ này để làm gì.
Ben Lee

8

Điều này sẽ được hiểu, cho dù bạn làm điều đó hay không nên phụ thuộc vào các quy ước (nhóm hoặc công ty) địa phương. Lưu ý rằng điều đó có ý nghĩa ít hơn trong ngữ cảnh của TDD vì TEST phải là điều quyết định rằng phương thức này không được thực hiện.

Phiên bản ngắn là: sử dụng nếu bạn và nhóm của bạn cho rằng nó phù hợp.


5
FWIW, Ném ngoại lệ sẽ là một cách tốt để khiến bài kiểm tra thất bại, nếu vì lý do nào đó bạn cần buộc hành vi đó. (Chẳng hạn, nó sẽ hữu ích như một phần của sơ đồ intellisense định nghĩa phương thức.)
DougM

1

Có vẻ như điều đó NotImplementedErrorthường được nêu ra cho chính sự phát triển tính năng của Python, như sau:

@classmethod
def fromkeys(cls, iterable, v=None):
    # There is no equivalent method for counters because setting v=1
    # means that no element can have a count greater than one.
    raise NotImplementedError(
        'Counter.fromkeys() is undefined.  Use Counter(iterable) instead.')

Tài liệu

từ khóa (lặp lại)

Phương thức lớp này không được thực hiện cho các đối tượng Counter.

Nguồn

Bộ sưu tập.Count.fromkeys

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.