【问题标题】:Python: tell my IDE what type an object isPython:告诉我的 IDE 对象是什么类型
【发布时间】:2020-08-03 14:52:41
【问题描述】:

当我在 Python (v2.7) 中编写函数时,我经常会想到其中一个参数的类型。我正在使用令人难以置信的出色 pandas 库在运动中工作,所以我的论点通常“打算”是 pandas.DataFrames。

在我最喜欢的 IDE (Spyder) 中,当您键入句点 . 时,会出现方法列表。此外,当您键入方法的左括号时,文档字符串会出现在一个小窗口中。

但是要让这些东西起作用,IDE 必须知道变量是什么类型。但当然,它永远不会。我是否遗漏了一些关于如何编写 Pythonic 代码的明显内容(我已阅读 Python Is Not Java,但它没有提到这个 IDE 自动完成问题。

有什么想法吗?

【问题讨论】:

    标签: python autocomplete ide spyder


    【解决方案1】:

    我不知道它是否适用于 Spyder,但许多完成引擎(例如 Jedi)也支持断言来告诉他们变量是什么类型。例如:

    def foo(param):
        assert isinstance(param, str)
        # now param will be considered a str
        param.|capitalize
               center
               count
               decode
               ...
    

    【讨论】:

    • 在 PyCharm 中工作
    【解决方案2】:

    实际上我使用 IntelliJ 想法(又名 pyCharm),它们提供了多种指定变量类型的方法:

    1.指定简单变量

    非常简单:只需在定义后面添加带有类型信息的注释即可。从现在开始 Pycharm 支持自动完成!例如:

    def route():
        json = request.get_json() # type: dict
    

    来源:https://www.jetbrains.com/help/pycharm/type-hinting-in-pycharm.html

    2。指定参数:

    在方法的开头添加三个引号,idea会自动完成一个文档字符串,如下例所示:

    来源:https://www.jetbrains.com/help/pycharm/using-docstrings-to-specify-types.html

    (目前在我的手机上,稍后会制作)

    【讨论】:

    • 第二个选项在我看来是最干净和最简单的。你只需要在一个类中使用它一次并将它存储在一个字段中就可以了,而使用“assert isinstance”你必须在每个方法中使用它。
    【解决方案3】:

    如果您使用的是 Python 3,则可以使用 function annotations。举个例子:

    @typechecked
    def greet(name: str, age: int) -> str:
        print("Hello {0}, you are {1} years old".format(name, age))
    

    我不使用 Spyder,但我认为它有办法读取注释并采取适当的行动。

    【讨论】:

    • 糟糕。应该指定 Python 2.7.1。我会更新问题。
    【解决方案4】:

    我不知道 Spyder 是否读取文档字符串,但 PyDev 可以:

    http://pydev.org/manual_adv_type_hints.html

    因此您可以在文档字符串中记录预期的类型,例如如:

    def test(arg):
        'type arg: str'
        arg.<hit tab>
    

    你会得到相应的字符串标签补全。

    同样,您可以记录函数的返回类型,以便您可以在foo 上为foo = someFunction() 获得制表符补全。

    同时,文档字符串使自动生成的文档更有帮助。

    【讨论】:

    • 天哪。 Spyder的人,Spyder能做到吗? (我早期的实验表明不是,但我不想把它写下来!)
    • (Spyder dev here) @LondonRob 抱歉,我们不支持。我们仅限于我们使用的代码完成库(称为rope)提供的功能。也许这是在一个名为 jedi 的新库中实现的(很快就会支持它),但老实说我不知道​​。
    【解决方案5】:

    问题在于 Python 的动态特性,我使用 Spyder,并且我使用了更多的 Python IDE(PyCharm、IDLE、WingIDE、PyDev,...),它们都存在您在此处所述的问题.因此,当我需要代码完成以寻求帮助时,我只需将变量实例化为我想要的类型,然后键入“。”,例如:假设您知道您的 var df 在某些代码中将是 DataFrame,您可以做到这一点df = DataFrame(),现在代码完成应该对你有用,只是不要忘记在完成代码编辑时删除(或注释)df = DataFrame() 行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-05
      • 2020-01-04
      • 1970-01-01
      • 2015-08-29
      • 2017-07-27
      • 1970-01-01
      相关资源
      最近更新 更多