Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 避免被污染的名称空间咬伤_Python_Namespaces - Fatal编程技术网

Python 避免被污染的名称空间咬伤

Python 避免被污染的名称空间咬伤,python,namespaces,Python,Namespaces,我只花了将近一个小时来追踪当时非常混乱的错误信息。错误的来源是这段代码(就本问题而言,所有代码的意义都无关紧要): 导致此错误的原因: *** TypeError: Required argument 'filename' (pos 2) not found 错误的原因是我忽略了导入文件顶部的compile函数(从) 因此,compile指的是。虽然现在我已经理解了错误的原因,错误信息对我来说似乎非常清楚,但我最终还是浪费了大量时间查看了包源代码,以为我是从包源代码导入函数的,认为错误来自于包

我只花了将近一个小时来追踪当时非常混乱的错误信息。错误的来源是这段代码(就本问题而言,所有代码的意义都无关紧要):

导致此错误的原因:

*** TypeError: Required argument 'filename' (pos 2) not found
错误的原因是我忽略了导入文件顶部的
compile
函数(从)

因此,
compile
指的是。虽然现在我已经理解了错误的原因,错误信息对我来说似乎非常清楚,但我最终还是浪费了大量时间查看了包源代码,以为我是从包源代码导入函数的,认为错误来自于包源代码。相反,它始终来自内置的
compile

compile
函数是我常常忘记甚至存在的东西。我几乎从未使用过它,事实上,在内置列表中有许多函数,比如
compile
,我也从未使用过(我看着,和,!),因此它们坐在那里除了污染我的名称空间之外什么也没做

通常,当忘记导入某些内容时,只会出现
名称错误
,在这种情况下,原因很明显;但是,当名称空间中潜伏着一些东西时,我并没有把它们放在那里,它就不那么明显了。有没有充分的证据来避免这样的问题


可以做些什么?或者这只是每一个Python程序员必须学习的东西吗?

我唯一能避免这个问题的想法就是不要从一开始就将对象导入名称空间。例如,而不是:

from parse import compile
可以这样做:

import parse
parse.compile(...)
这就解决了问题。但是,我不喜欢这个解决方案,因为我计划从该模块的
parse
包中使用的唯一东西是
compile
。读者(即未来的我)会更直接、更清楚地了解,当导入的内容是预先准备好的时候,为什么以及我使用了
parse
模块


更好的解决方案是采用“设置并忘记”的方式,从全局名称空间中删除对我工作的模块不有用的内容。

或许可以使用突出显示内置名称的IDE?这样,就可以清楚地知道代码是否引用了内置名称。Pycharm就是这样做的。因为我从来没有经常使用IDE,所以这个解决方案对我来说并不明显,尽管我确信它可能对那些使用过IDE的人来说是显而易见的。我通常说“我不需要IDE”(我只使用记事本++),但我想今晚我已经证明了我需要。parse import compile as的
是否适合未来的你理解?@Eric我不知道。。。未来的我很愚蠢。总的来说,这是一个很好的建议,但我的抱怨是,为了记住我需要这样做,我需要记住——今天——首先要注意命名空间中的大量污染。。。缺乏这种正念是问题的根源。导入的
是一种相对容易grep的模式,因此您可以自动扫描代码以查找这种异常。或者你甚至可以为@Eric编写一个插件,这听起来是一个非常可行的解决方案-谢谢!
import parse
parse.compile(...)