python中的数千行错误是啥
Posted
技术标签:
【中文标题】python中的数千行错误是啥【英文标题】:What are the thousands of lines in error in pythonpython中的数千行错误是什么 【发布时间】:2020-02-28 04:03:39 【问题描述】:我不确定当 python 错误打印 line 1500 in __getitem__
或 line 1913, in _getitem_axis
时这意味着什么 - 这些行来自哪里?
例如,
Traceback (most recent call last):
File "script.py", line 6, in <module>
us = df.loc['origin' == 'US']
File "script.py", line 1500, in __getitem__
return self._getitem_axis(maybe_callable, axis=axis)
File "script.py", line 1913, in _getitem_axis
return self._get_label(key, axis=axis)
File "script.py", line 141, in _get_label
return self.obj._xs(label, axis=axis)
File "script.py", line 3575, in xs
loc = self.index.get_loc(key)
File "script.py", line 2604, in get_loc
return self._engine.get_loc(self._maybe_cast_indexer(key))
File "script.py", line 108, in pandas._libs.index.IndexEngine.get_loc
File "script.py", line 129, in pandas._libs.index.IndexEngine.get_loc
File "script.py", line 91, in pandas._libs.index.Int64Engine._check_type
KeyError: False
附注感谢您是否可以使用人类语言或通过类比/示例进行解释。
【问题讨论】:
错误File "script.py", line 1500
表示文件script.py
中的第1500 行。函数名称只是帮助您调试的附加信息。
这称为“回溯”或(如上)“回溯”。使用这些作为您研究的关键字。
@DanielRoseman 我的代码本身只有几行。文件在哪里?它是如何创建的?
@DanielRoseman 我认为很明显他们对此类程序的工作方式存在根本性的误解。一个新程序员可能只写了 10 行代码,并且期望(天真地,但如果他们是编程新手,这并不太出乎意料)只有他们的代码可以运行。如果他们从不属于他们自己的文件和他们以前从未见过的行中获得所有这些错误输出,他们可能会混淆该代码的来源。他们不理解语言功能中隐含的内置类型事物或标准库。
"我的代码本身只有几行。文件在哪里?"您是否将代码保存到文件中?是否命名为script.py
?那就是文件,确实有那么长。或者也许其他人给了你一个script.py
文件,而你写了import script
之类的东西?
【参考方案1】:
这些函数是 Python 内置支持的一部分;许多例程很长,或者是长模块中的一个功能。点是命名约定的一部分:包,模块,子模块,...功能。比如
pandas._libs.index.IndexEngine.get_loc
get_loc
是PANDAS数据帧包中的基本位置检索功能。
【讨论】:
【参考方案2】:这是一个堆栈跟踪。它不仅显示了实际错误直接发生的位置,还显示了程序在发生错误时正在做什么。
代码df.loc['origin' == 'US']
(第6 行)位于跟踪的顶部,这意味着它是根本原因,但这本身并不是错误。这将评估'origin' == 'US'
到False
,因为这是一个简单的字符串比较并且字符串不相等,然后它将评估df.loc[False]
。
评估这个需要在对象df.loc
中查找键False
。这会调用 __getitem__
方法,每当您使用语法 a[b]
访问密钥时都会调用该方法。
__getitem__
方法有一行return self._getitem_axis(maybe_callable, axis=axis)
调用名为_getitem_axis
的方法。这是文件的第 1500 行。
_getitem_axis
方法有一行return self._get_label(key, axis=axis)
,调用了一个方法_get_label
。这是文件的第 1913 行。
...等等...
最后,pandas._libs.index.Int64Engine._check_type
方法检查密钥的类型。密钥是False
,它的类型是bool
。据推测,这不是您正在执行的查找的有效类型,因此_check_type
方法引发了KeyError
。
【讨论】:
【参考方案3】:在一般意义上和“人类语言”中,python 是一种高级编程语言。这意味着在将输入到控制台的英文单词翻译成机器作为指令的位时,它对程序员隐藏了很多东西。采取简单的乘法。您可能想当然地认为2 * 2
中的星号*
表示乘法,但您的计算机不能也不会认为这是理所当然的。不,必须有一个文件在您的代码中定义 ASCII 符号 *
的使用,以及在遇到时如何将两个数字相乘(或者就此而言,如何执行 2 * 'string'
之类的操作)。所有这些较低级别的定义都位于您机器上的 python 安装中的某个位置。当您以英语单词输入指令时,编译器必须逐行解析它,围绕所有这些较低级别定义的 python 安装,并基于这些定义,将您的 python 转换为计算机可以实际工作的东西和。在执行这个密集的过程中,对于一个非常简单的 python 语句,可能会遇到许多不同的函数和定义,可能跨越多个文件和安装的库。如果在此过程中遇到编译器不知道如何继续的问题,则会引发错误。抛出的错误可能看起来很复杂,但正如其他人所描述的,它包含关于在发现错误的那一刻编译器正在查看的内容的整个跟踪。这在调试您的程序(或者甚至可能在您必须导入的库中发现错误等)时提供了巨大的帮助。
希望这会有所帮助!
【讨论】:
以上是关于python中的数千行错误是啥的主要内容,如果未能解决你的问题,请参考以下文章