2013-07-24 12 views
32

Tôi thực sự thích sử dụng docstrings trong Python để chỉ định tham số kiểu khi dự án vượt quá một kích thước nhất định.Làm thế nào để xác định rằng một tham số là danh sách các đối tượng cụ thể trong tài liệu Python

Tôi đang gặp khó khăn khi tìm tiêu chuẩn để sử dụng để chỉ định rằng tham số là danh sách các đối tượng cụ thể, ví dụ: trong các loại Haskell tôi muốn sử dụng [String] hoặc [A].

tiêu chuẩn hiện hành (dễ nhận biết bởi biên tập PyCharm):

def stringify(listOfObjects): 
    """ 
    :type listOfObjects: list 
    """ 
    return ", ".join(map(str, listOfObjects)) 

Những gì tôi muốn:

OPTION 1

def stringify(listOfObjects): 
    """ 
    :type listOfObjects: list<Object> 
    """ 
    return ", ".join(map(str, listOfObjects)) 

OPTION 2

def stringify(listOfObjects): 
    """ 
    :type listOfObjects: [Object] 
    """ 
    return ", ".join(map(str, listOfObjects)) 

Tôi cho rằng đó không phải là một ví dụ tuyệt vời - trường hợp sử dụng phù hợp hơn sẽ là trường hợp các đối tượng trong danh sách phải thuộc một loại cụ thể.

ví dụ tốt hơn

class Food(Object): 
    def __init__(self, calories): 
     self.calories = calories 

class Apple(Food): 
    def __init__(self): 
     super(self, 200) 

class Person(Object): 
    energy = 0 
    def eat(foods): 
     """ 
     :type foods: [Food] # is NOT recognised by editor 
     """ 
     for food in foods: 
      energy += food.calories 

Vì vậy, khác với thực tế là tôi nhận được đói, ví dụ này minh họa rằng nếu gọi với một danh sách các loại sai đối tượng, mã sẽ phá vỡ. Do đó tầm quan trọng của tài liệu không chỉ là nó cần một danh sách, nhưng nó cần một danh sách các thực phẩm.

CÂU HỎI LIÊN QUAN How can I tell PyCharm what type a parameter is expected to be? Xin lưu ý rằng tôi đang tìm kiếm một câu trả lời cụ thể hơn so với cái trên.

+0

Bạn đã kiểm tra PEP trên trang web python chưa? – Jiminion

+0

Tôi đã không tìm thấy một cho điều này, nhưng tôi có thể đã bỏ lỡ nó – Alex

+0

Có thể trùng lặp của http://stackoverflow.com/questions/24853923/python-3-annotations-type-hinting-a-list-of-a- quy định-loại-pycharm (nơi tôi đã học về mô-đun 'gõ' của Python 3.5). – Noumenon

Trả lời

39

Trong phần ý kiến ​​của PyCharm's manual có một gợi ý tốt từ nhà phát triển:

#: :type: dict of (str, C) 
#: :type: list of str 

Nó hoạt động đối với tôi khá tốt. Bây giờ nó làm cho tôi tự hỏi cách tốt nhất để tài liệu các lớp parametrized trong Python :) là gì.

+0

Câu trả lời này đã lỗi thời, với việc tạo ra [PEP 484] (https://www.python.org/dev/peps/pep-0484/) vào cuối năm 2014. Nhưng đó là một câu trả lời hay vào thời điểm đó! :-) – Jason

+3

Lưu ý: Câu trả lời chỉ lỗi thời đối với Python 3.5 trở lên. –

3

trong python

type([1,2,3]) == type(['a', 'b', 'c']) 

bạn cũng có thể thêm một chuỗi vào danh sách ints.

Vì vậy, đối với những gì bạn đang cố gắng để đạt được PyCharm sẽ phải kiểm tra ma thuật toàn bộ mã của bạn cho những gì bạn đang thêm vào danh sách trước khi chuyển nó làm đối số.

Bạn có thể có một cái nhìn tại câu hỏi này tuy nhiên Python : define a list of a specific type of object

mảng mô-đun cho phép chỉ 'giá trị cơ bản.

Chỉ giải pháp tôi có thể nghĩ đến ở đây là tạo lớp của riêng bạn mở rộng danh sách python "FoodsList" có thể kiểm tra loại trước khi thêm phần tử.

class Food(): 
    def __init__(self, calories): 
     self.calories = calories 

class FoodsList(list): 
    #you can optionally extend append method here to validate type 
    pass 

def eat(foods): 
    """ 
    :type foods: FoodsList 
    """ 
    energy = 0 
    for food in foods: 
     energy += food.calories 
    return energy 


list = FoodsList() 
list.append(Food(3)) 
list.append(Food(4)) 
print eat(list) 
+0

+1: Nó giải quyết vấn đề một cách tốt hơn nhiều so với tôi đã hy vọng cho :) cái nhìn tốt – Alex

+0

mặc dù tôi nghi ngờ rằng PyCharm là khá khả năng 'kỳ diệu' kiểm tra tất cả các mã của tôi để xem những gì tôi đang thêm vào danh sách - đó là những gì nó được thiết kế để làm :) – Alex

1

Khi viết docstrings theo phong cách google bạn có thể làm:

class ToDocument(object): 
    """This is my Documentation. 

    Args: 
     typed_list (:obj:`list` of :obj:`str`): Description of typed list 

    """ 
    ... 

này cũng hoạt động khá tốt trong nhân sư, khi kết hợp với các napoleon-mở rộng. Tham khảo extension's doc để biết thêm các ví dụ về tài liệu.

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