PyDev:模块的@DynamicAttrs
在我写的程序中,我创建了一个叫做 settings
的模块,这个模块里声明了一些常量,但也从一个配置文件中加载其他常量,把它们放在模块的命名空间里(比如,π的值可能在模块代码里,而用户的体重则在配置文件中)。
这样一来,在其他模块中,我可以这样使用:
from settings import *
一切运行得很好,但在使用Aptana Studio / PyDev时,代码分析工具却报了很多 未定义变量错误
,像这样:
我发现这里有一个标志可以用来防止这种情况在类的文档字符串中出现,但如果我在模块级别使用它就没有效果。所以我想知道两件事:
有没有办法选择性地去掉这些错误(也就是说,我不想完全关闭“将未定义变量标记为错误”的选项:在其他模块中,这确实可能是个错误)?
如果没有,有没有其他方法可以实现我想要的,在使用通配符导入的情况下,但又不会让代码分析工具感到困惑?
预先说明:我完全意识到通配符导入是不被推荐的。
2 个回答
你可以在出现错误的地方按下 Ctrl-1,然后选择 @UndefinedVariable
,或者在你想忽略的错误行上输入 #@UndefinedVariable
。
你还可以尝试把你的模块添加到 PyDev 解释器的扫描列表中。方法是打开窗口,选择“首选项”,然后找到 PyDev,再点击“解释器 - Python”。在“库”标签下,点击 新建文件夹
,然后找到包含 settings
的文件夹,接着点击 应用
。希望 PyDev 能找到你的包,并识别那些被广泛导入的变量。
其实即使不是随意导入,你也可能会遇到同样的错误(比如:导入设置 / settings.MY_VARIABLE 也会显示错误,因为代码分析找不到它)。
除了在每个引用它的地方出现的 @UndefinedVariable
(按 CTRL + 1 可以看到这个选项),我觉得你的模块可以用一个更好的方式来处理:
MY_VARIABLE = 'default value'
...
update_default_values() # Go on and override the defaults.
这样,代码分析(以及任何阅读你模块的人)就能知道哪些变量是需要的。
否则,如果你之前不知道这些变量,我觉得更好的方法是使用一个方法(比如: get_settings('MY_VARIABLE')
)。
这和实际问题无关。我真的不建议在这里使用随意导入(甚至不建议导入常量... 比如: from settings import MY_VARIABLE
)。
对于设置模块,始终使用以下方式是更好的选择:
import settings
settings.MY_VARIABLE
(因为如果任何地方决定要改变 MY_VARIABLE,任何在自己命名空间中引用它的地方可能永远都得不到这个改变后的变量)。
一个更安全的方法是使用 get_setting('var')
这个方法,因为它可以让你更好地延迟加载你的设置(也就是说,不在导入时加载,而是在第一次调用时加载)。