Làm thế nào tôi có thể nói với PyCharm loại tham số dự kiến ​​sẽ là gì?


173

Khi nói đến các hàm tạo, các bài tập và các lệnh gọi phương thức, PyCharm IDE khá giỏi trong việc phân tích mã nguồn của tôi và tìm ra loại biến nào nên có. Tôi thích nó khi nó đúng, bởi vì nó cung cấp cho tôi thông tin tham số và hoàn thành mã tốt và nó cho tôi cảnh báo nếu tôi cố truy cập vào một thuộc tính không tồn tại.

Nhưng khi nói đến thông số, nó không biết gì. Danh sách thả xuống hoàn thành mã không thể hiển thị bất cứ điều gì, vì họ không biết loại tham số sẽ là gì. Phân tích mã không thể tìm kiếm cảnh báo.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

peasant = Person("Dennis", 37)
# PyCharm knows that the "peasant" variable is of type Person
peasant.dig_filth()   # shows warning -- Person doesn't have a dig_filth method

class King:
    def repress(self, peasant):
        # PyCharm has no idea what type the "peasant" parameter should be
        peasant.knock_over()   # no warning even though knock_over doesn't exist

King().repress(peasant)
# Even if I call the method once with a Person instance, PyCharm doesn't
# consider that to mean that the "peasant" parameter should always be a Person

Điều này làm cho một số lượng ý nghĩa nhất định. Các trang web cuộc gọi khác có thể vượt qua bất cứ điều gì cho tham số đó. Nhưng nếu phương thức của tôi hy vọng một tham số có kiểu, giả sử, pygame.Surfacetôi muốn có thể chỉ ra điều đó cho PyCharm bằng cách nào đó, để nó có thể hiển thị cho tôi tất cả các Surfacethuộc tính trong trình đơn thả xuống hoàn thành mã của nó và làm nổi bật cảnh báo nếu Tôi gọi sai phương pháp, vân vân.

Có cách nào tôi có thể đưa ra gợi ý cho PyCharm và nói "psst, tham số này được cho là thuộc loại X" không? (Hoặc có lẽ, theo tinh thần của các ngôn ngữ động, "tham số này được cho là giống như một chữ X"? Tôi sẽ ổn với điều đó.)


EDIT: Câu trả lời của CrazyCoder, bên dưới, thực hiện mẹo. Đối với bất kỳ người mới nào như tôi muốn tóm tắt nhanh, đây là:

class King:
    def repress(self, peasant):
        """
        Exploit the workers by hanging on to outdated imperialist dogma which
        perpetuates the economic and social differences in our society.

        @type peasant: Person
        @param peasant: Person to repress.
        """
        peasant.knock_over()   # Shows a warning. And there was much rejoicing.

Phần có liên quan là @type peasant: Persondòng của doc Chuỗi.

Nếu bạn cũng đi đến Tệp> Cài đặt> Công cụ tích hợp Python và đặt "Định dạng chuỗi" thành "Epytext", thì Chế độ xem> Tài liệu nhanh của PyCharm sẽ in khá tốt thông tin tham số thay vì chỉ in tất cả các dòng @.


7
Cần lưu ý rằng nhận xét tái cấu trúc sử dụng các thẻ giống nhau được viết khác nhau: @param xx: yyytrở thành :param xx: yyy. Xem jetbrains.com/pycharm/webhelp/ từ
Wernight

1
Tại sao chúng ta có thể thoát khỏi việc không chỉ định tên lớp đủ điều kiện?
Jesvin Jose

Câu trả lời:


85

Có, bạn có thể sử dụng định dạng tài liệu đặc biệt cho các phương thức và tham số của chúng để PyCharm có thể biết loại. Phiên bản PyCharm gần đây hỗ trợ hầu hết các định dạng tài liệu phổ biến .

Ví dụ: PyCharm trích xuất các loại từ nhận xét kiểu @param .

Xem thêm reStructuredTextước docstring (PEP 257).

Một tùy chọn khác là chú thích Python 3.

Vui lòng tham khảo phần tài liệu PyCharm để biết thêm chi tiết và mẫu.


2
Tôi nghĩ PyCharm đã thay đổi định dạng doc một chút (xem jetbrains.com/help/pycharm/ ,), nhưng cảm ơn! Việc thiếu thông tin về các thông số đã khiến tôi phát điên.
khai thác

46

Nếu bạn đang sử dụng Python 3.0 trở lên, bạn cũng có thể sử dụng các chú thích trên các hàm và tham số. PyCharm sẽ hiểu đây là loại đối số hoặc giá trị trả về dự kiến ​​sẽ có:

class King:
    def repress(self, peasant: Person) -> bool:
        peasant.knock_over() # Shows a warning. And there was much rejoicing.

        return peasant.badly_hurt() # Lets say, its not known from here that this method will always return a bool

Đôi khi điều này hữu ích cho các phương thức không công khai, không cần chuỗi doc. Là một lợi ích bổ sung, những chú thích đó có thể được truy cập bằng mã:

>>> King.repress.__annotations__
{'peasant': <class '__main__.Person'>, 'return': <class 'bool'>}

Cập nhật : Kể từ PEP 484 , đã được chấp nhận cho Python 3.5, đây cũng là quy ước chính thức để xác định các loại đối số và trả về bằng cách sử dụng các chú thích.


4
... và có một số gói sử dụng các thông báo như vậy để thực hiện kiểm tra loại thời gian chạy. Điều này vừa thuận tiện hơn để sử dụng và dễ đọc hơn là làm tương tự bằng các xác nhận và có thể được sử dụng một cách chọn lọc giống nhau. typecheck-decoratorlà một trong những gói như vậy và có một bản tóm tắt của những người khác trong tài liệu của nó. (Cũng linh hoạt: bạn thậm chí có thể thực hiện gõ vịt kiểm tra!)
Lutz Prechelt

5

PyCharm trích xuất các loại từ một chuỗi pydoc @type. Xem tài liệu PyCharm tại đâyđây , và tài liệu Epydoc . Nó nằm trong phần 'di sản' của PyCharm, có lẽ nó thiếu một số chức năng.

class King:
    def repress(self, peasant):
        """
        Exploit the workers by hanging on to outdated imperialist dogma which
        perpetuates the economic and social differences in our society.

        @type peasant: Person
        @param peasant: Person to repress.
        """
        peasant.knock_over()   # Shows a warning. And there was much rejoicing.

Phần có liên quan là @type peasant: Persondòng của doc Chuỗi.

Ý định của tôi là không lấy cắp điểm từ CrazyCoder hoặc người hỏi ban đầu, bằng mọi cách hãy cho họ điểm của họ. Tôi chỉ nghĩ rằng câu trả lời đơn giản nên nằm trong một ô 'câu trả lời'.


2

Tôi đang sử dụng PyCharm Professional 2016.1 viết mã py2.6-2.7 và tôi thấy rằng bằng cách sử dụng reSturationuredText, tôi có thể diễn đạt các loại theo cách gọn gàng hơn:

class Replicant(object):
    pass


class Hunter(object):
    def retire(self, replicant):
        """ Retire the rogue or non-functional replicant.
        :param Replicant replicant: the replicant to retire.
        """
        replicant.knock_over()  # Shows a warning.

Xem: https://www.jetbrains.com/help/pycharm/2016.1/type-hinting-in-pycharm.html#legacy


1

Bạn cũng có thể khẳng định một loại và Pycharm sẽ suy ra:

def my_function(an_int):
    assert isinstance(an_int, int)
    # Pycharm now knows that an_int is of type int
    pass
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.