ฉันจะบอก PyCharm ได้อย่างไรว่าพารามิเตอร์ประเภทใดที่คาดว่าจะเป็น


173

เมื่อพูดถึง Constructor และการมอบหมายและการเรียกเมธอด PyCharm IDE ค่อนข้างดีในการวิเคราะห์ซอร์สโค้ดของฉันและการหาว่าตัวแปรแต่ละชนิดควรเป็นอะไร ฉันชอบเมื่อมันถูกต้องเพราะมันให้ข้อมูลโค้ดที่สมบูรณ์และพารามิเตอร์ที่ดีและให้คำเตือนแก่ฉันถ้าฉันพยายามเข้าถึงแอตทริบิวต์ที่ไม่มีอยู่

แต่เมื่อพูดถึงพารามิเตอร์มันไม่รู้อะไรเลย ดร็อปดาวน์การทำให้โค้ดเสร็จสมบูรณ์ไม่สามารถแสดงอะไรได้เนื่องจากพวกเขาไม่รู้ว่าจะใช้พารามิเตอร์ประเภทใด การวิเคราะห์รหัสไม่สามารถมองหาคำเตือนได้

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

สิ่งนี้ทำให้ความรู้สึกบางอย่าง ไซต์การโทรอื่น ๆ สามารถส่งผ่านสิ่งใดก็ได้สำหรับพารามิเตอร์นั้น แต่ถ้าวิธีการของฉันคาดว่าพารามิเตอร์จะเป็นประเภทพูดว่าpygame.Surfaceฉันต้องการที่จะสามารถระบุว่าเพื่อ PyCharm อย่างใดเพื่อให้สามารถแสดงSurfaceคุณลักษณะทั้งหมดของฉันในแบบเลื่อนลงรหัสเสร็จและเน้นคำเตือนถ้า ฉันเรียกวิธีการที่ผิดและอื่น ๆ

มีวิธีที่ฉันสามารถให้คำแนะนำ PyCharm และพูดว่า "psst พารามิเตอร์นี้ควรจะเป็นประเภท X"? (หรือบางทีในจิตวิญญาณของภาษาแบบไดนามิก "พารามิเตอร์นี้ควรจะต้มตุ๋นเหมือน X" ฉันจะไม่เป็นไร)


แก้ไข:คำตอบของ CrazyCoder ด้านล่างทำเคล็ดลับ สำหรับผู้มาใหม่เช่นฉันที่ต้องการสรุปสั้น ๆ นี่คือ:

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.

ส่วนที่เกี่ยวข้องคือ@type peasant: Personบรรทัดของ docstring

หากคุณไปที่ไฟล์> การตั้งค่า> เครื่องมือรวม Python และตั้งค่า "รูปแบบ Docstring" เป็น "Epytext" จากนั้นมุมมองของ PyCharm> การค้นหาเอกสารด่วนจะพิมพ์ข้อมูลพารามิเตอร์แทนการพิมพ์ @ -lines ตามที่เป็นอยู่ทั้งหมด


7
มันเป็นที่น่าสังเกตว่า reStructuredText ความคิดเห็นใช้แท็กเดียวกันเพียงแค่เขียนที่แตกต่างกัน: กลายเป็น@param xx: yyy :param xx: yyyดูjetbrains.com/pycharm/webhelp/…
Wernight

1
ทำไมเราถึงออกไปโดยไม่ระบุชื่อคลาสที่มีคุณสมบัติครบถ้วน
Jesvin Jose

คำตอบ:


85

ใช่คุณสามารถใช้รูปแบบเอกสารพิเศษสำหรับวิธีการและพารามิเตอร์เพื่อให้ PyCharm รู้ประเภท รุ่นล่าสุด PyCharm สนับสนุนรูปแบบเอกสารที่พบมากที่สุด

ตัวอย่างเช่น PyCharm แยกประเภทจากความคิดเห็นสไตล์ @paramความเห็นสไตล์

ดูเพิ่มเติมที่ข้อตกลงreStructuredTextและdocstring (PEP 257)

ตัวเลือกอื่นคือหมายเหตุประกอบ Python 3

โปรดดูส่วนเอกสารประกอบ PyCharmสำหรับรายละเอียดและตัวอย่างเพิ่มเติม


2
ฉันคิดว่า PyCharm เปลี่ยนรูปแบบ doc เล็กน้อย (ดูjetbrains.com/help/pycharm/ ...... ) แต่ขอบคุณ! การขาดความรู้ทางด้านพารามิเตอร์ทำให้ฉันรู้สึกไม่ดี
ต้นขั้ว

46

หากคุณใช้ Python 3.0 หรือใหม่กว่าคุณสามารถใช้คำอธิบายประกอบกับฟังก์ชั่นและพารามิเตอร์ PyCharm จะตีความสิ่งเหล่านี้เป็นประเภทที่อาร์กิวเมนต์หรือค่าส่งคืนที่คาดว่าจะมี:

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

บางครั้งสิ่งนี้มีประโยชน์สำหรับวิธีที่ไม่ใช่แบบสาธารณะซึ่งไม่ต้องการ docstring ในฐานะที่เป็นประโยชน์เพิ่มเติมรหัสผ่านสามารถเข้าถึงได้ด้วยรหัส:

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

อัปเดต : ณPEP 484ซึ่งเป็นที่ยอมรับสำหรับ Python 3.5 มันเป็นแบบแผนทางการเพื่อระบุประเภทอาร์กิวเมนต์และชนิดส่งคืนโดยใช้คำอธิบายประกอบ


4
... และมีหลายแพ็คเกจที่ใช้หมายเหตุประกอบเพื่อดำเนินการตรวจสอบชนิดเวลาทำงาน นี่คือทั้งสะดวกในการใช้และอ่านง่ายกว่าทำเหมือนกันโดยยืนยันและสามารถเลือกใช้เหมือนกัน typecheck-decoratorเป็นหนึ่งในแพคเกจดังกล่าวและมีการสรุปของคนอื่นในเอกสารประกอบ (มีความยืดหยุ่นเช่นกัน: คุณสามารถพิมพ์เป็ดได้แม้จะพิมพ์!)
Lutz Prechelt

5

PyCharm แยกชนิดจากสตริง @type pydoc ดูเอกสาร PyCharm ที่นี่และที่นี่และเอกสาร Epydoc มันอยู่ในส่วน 'ดั้งเดิม' ของ PyCharm บางทีมันอาจไม่มีฟังก์ชั่นบางอย่าง

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.

ส่วนที่เกี่ยวข้องคือ@type peasant: Personบรรทัดของ docstring

ความตั้งใจของฉันคือไม่ขโมยคะแนนจาก CrazyCoder หรือผู้ถามดั้งเดิมโดยทั้งหมดให้คะแนนของพวกเขา ฉันแค่คิดว่าคำตอบง่ายๆควรอยู่ในช่อง 'คำตอบ'


2

ฉันใช้ PyCharm Professional 2016.1 การเขียนรหัส py2.6-2.7 และฉันพบว่าการใช้ reStructuredText ฉันสามารถแสดงประเภทได้อย่างชัดเจนยิ่งขึ้น:

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.

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


1

คุณสามารถยืนยันประเภทและ Pycharm จะอนุมานมัน:

def my_function(an_int):
    assert isinstance(an_int, int)
    # Pycharm now knows that an_int is of type int
    pass
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.