gpt4 book ai didi

python - 返回 python 对象方法的智能感知

转载 作者:太空宇宙 更新时间:2023-11-04 00:56:15 24 4
gpt4 key购买 nike

我是 Python 的新手,我非常喜欢这门语言。但是我最近在 eclipse 中使用 PyDev 时遇到了一个恼人的问题。

一些方法返回了一些类的实例。但是我无法获得实例方法的智能感知。

例如:

import openpyxl
from openpyxl.reader.excel import load_workbook
from openpyxl.worksheet import Worksheet


xlsFile='hello.xlsx'
wbook = load_workbook(xlsFile)

wsheet1=wbook.get_sheet_by_name('mysheet')
wsheet1.cell('A9').hyperlink=r'\\sharefolder'

wsheet2=Worksheet()
wsheet2.cell('A1').hyperlink=r'\\sharefolder'

在此代码中,我可以使用 wsheet2 获得方法 cell() 的提示,但不能使用 wsheet1。虽然它们都是我已经导入的 Worksheet 类型。似乎 python 或 PyDev 无法正确检测返回对象的类型。

这是语言限制吗?还是我做错了什么?现在,我必须深入研究源代码,看看返回值的真实类型是什么。然后检查该类型中定义的方法。这非常乏味。

我写了一个小测试来重现这个问题。奇怪,智能感知似乎有效。

enter image description here

最佳答案

这是因为 Python 是动态类型的。

在 C# 等静态类型语言中,方法是用类型签名注释的。 (另外:在某些系统中,类型检查器可以推断。)编译器知道函数的返回类型,以及参数应该具有的类型,而无需运行您的代码,因为您写下类型!这使您的工具不仅可以检查程序的类型,还可以构建有关程序中的方法及其类型的元数据; Intellisense 通过查询从您的程序文本中收集的元数据来工作。


Python 语言中没有内置静态类型系统。这使得工具更难在不运行代码的情况下为您提供提示。例如,这个函数的返回类型是什么?

def spam(eggs):
if eggs:
return "ham"
return 42

有时 spam返回一个字符串;有时它返回一个整数。 Intellisense 应在调用 spam 的返回值上显示哪些方法?

这个类有哪些可用属性?

class Spam:
def __getattr__(self, name):
if len(name) > 5:
return "foo"
return super().__getattr__(name)

Spam有时会动态生成属性:Intellisense 应该为 Spam 的实例显示什么? ?

在这些情况下没有正确答案。您可能可以自愿进行一些猜测(例如,您可以显示一个包含 strint 的关于 spam 返回值的方法的列表),但您不能给出正确的建议一直。


因此,Python 的 Intellisense 工具被简化为最佳猜测。在您给出的示例中,您的 IDE 对 get_sheet_by_name 的返回类型了解不够。为您提供有关 wsheet1 的信息.但是,它确实知道 wsheet2 的类型因为你刚刚将它实例化为 Worksheet .在您的第二个示例中,Intellisense 只是对 f1 的返回类型进行(正确的)猜测。通过检查其源代码。

顺便说一句,在像 IPython 这样的交互式 shell 中自动完成更可靠。这是因为 IPython 实际上运行的是您键入的代码。它可以告诉对象的运行时类型是什么,因为分析是在运行时发生的。

关于python - 返回 python 对象方法的智能感知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34962987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com