2011-11-29 36 views
6

Trong tài liệu một hàm Python, tôi thấy nó Pythonic nhiều điều để nói:Tài liệu Python: có thể lặp lại nhiều lần?

def Foo(i): 
    """i: An interable containing…""" 

... chứ không phải là ...

def Foo(i): 
    """i: A list of …""" 

Khi i thực sự không cần phải là một list. (Foo sẽ hoạt động vui vẻ trên set, tuple, v.v.) Sự cố là máy phát. Máy phát thường chỉ cho phép 1 lần lặp. Hầu hết các chức năng đều OK với máy phát hoặc vòng lặp chỉ cho phép một lần truyền, nhưng một số thì không.

Đối với những chức năng không thể chấp nhận máy phát/những thứ chỉ có thể được lặp lại một lần, có một thuật ngữ Python rõ ràng, nhất quán để nói "điều chỉ có thể được lặp lại nhiều lần" không?

Thuật ngữ Python cho iterableiterator dường như có định nghĩa "một lần, nhưng có thể nhiều hơn nếu bạn may mắn".

+1

Một "bộ sưu tập"? Nó dường như mô tả tất cả các loại ví dụ ở đây. – ephemient

+0

+1 cho việc sử dụng vùng chứa, dường như nắm bắt ý tưởng cơ bản theo cách ngắn gọn nhất, nhưng ... Tôi không nghĩ rằng mình đã thấy "vùng chứa" được sử dụng trong bất kỳ tài liệu Python nào? –

+1

Một thùng chứa là một đối tượng với phương thức '__contains __()', không cần thiết cũng không đủ để có thể tái sử dụng được. http://docs.python.org/library/collections.html#collections.Container –

Trả lời

2

Tôi không biết thuật ngữ chuẩn nào cho điều này, ít nhất là không ngoại lệ, nhưng tôi nghĩ "khả năng lặp lại có thể tái sử dụng" sẽ vượt qua được nếu bạn cần một cụm từ ngắn.

Trong thực tế, thường có thể cấu trúc chức năng của bạn để bạn không cần lặp lại trên i nhiều lần. Ngoài ra, bạn có thể tạo một danh sách ra khỏi vòng lặp và sau đó lặp lại trong danh sách bao nhiêu lần tùy thích; hoặc bạn có thể sử dụng itertools.tee để nhận nhiều "bản sao" độc lập của trình lặp. Điều đó cho phép bạn chấp nhận một máy phát điện ngay cả khi bạn cần phải sử dụng nó nhiều hơn một lần.

+1

Lưu ý rằng, như được chỉ ra trong [tài liệu] (https://docs.python.org/3/library/itertools.html# itertools.tee), "Nói chung, nếu một trình lặp sử dụng hầu hết hoặc tất cả dữ liệu trước khi một trình lặp khác bắt đầu, thì sẽ nhanh hơn khi sử dụng list() thay cho tee()." Trong trường hợp đó, 'tee()' sẽ sao chép/lưu trữ nội dung nhiều lần trong khi 'list()' sẽ chỉ lưu trữ nó một lần. – waterproof

1

Đây có lẽ là vấn đề về phong cách và sở thích hơn bất kỳ thứ gì khác, ... Tôi có một cách khác nhau trong tài liệu của mình: Tôi luôn viết docstring theo đầu vào mong muốn trong ngữ cảnh của chương trình.

Ví dụ: nếu tôi đã viết một hàm mong đợi để đi qua phím của một cuốn từ điển và bỏ qua giá trị của nó tôi viết:

arg : a dictionary of... 

ngay cả khi for e in arg: sẽ làm việc với iterables khác. Tôi đã chọn để làm như vậy, bởi vì trong bối cảnh mã của tôi, tôi không quan tâm nếu chức năng vẫn hoạt động ... Tôi quan tâm nhiều hơn rằng bất cứ ai đọc tài liệu đều hiểu cách chức năng đó là có nghĩa là sử dụng.

Mặt khác, nếu tôi viết một hàm tiện ích có thể đối phó với một phổ rộng các iterables do thiết kế, tôi đi một trong hai cách sau đây:

  1. tài liệu loại ngoại lệ sẽ được tăng theo các điều kiện nhất định [ví dụ: "Nâng cao TypeError nếu iterable không thể được lặp nhiều hơn một lần"]
  2. thực hiện một số lập luận pre-emptive xử lý đó sẽ làm cho các chức năng tương thích với 'lặp lại' một lần duy nhất.

Nói cách khác, tôi cố gắng hoặc làm cho chức năng của tôi đủ vững chắc để xử lý các trường hợp cạnh, hoặc rất thẳng thắn về giới hạn của nó.

Một lần nữa: không có gì sai với cách tiếp cận bạn muốn, nhưng tôi coi đây là một trong những trường hợp trong đó "explicit is better than implicit": tài liệu được đề cập là "có thể lặp lại có thể tái sử dụng" là chính xác, nhưng tính từ có thể dễ dàng bị bỏ qua.

HTH!

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