【问题标题】:PyDev: @DynamicAttrs for modulesPyDev:@DynamicAttrs 用于模块
【发布时间】:2011-09-22 21:02:31
【问题描述】:

在我正在编写的程序中,我创建了一个名为settings 的模块,它声明了一些常量,但从配置文件中加载了其他常量,将它们放置在模块命名空间中(例如:π 的值可能在代码中模块的权重,但用户在配置文件中的权重)。

在其他模块中,我可以这样做:

from settings import *

对我来说一切都很好,但是 - 使用 Aptana Studio / PyDev,代码分析工具会抛出很多 undefined variable errors 像这样:

我发现here 有一个标志可用于防止类文档字符串中的这种行为,但如果我尝试在模块级别使用它就没有效果。所以我想知道两件事:

  • 有没有办法选择性地消除这些错误(这意味着我不想完全关闭选项“将未定义的变量标记为错误”:在其他模块中它实际上可能是一个错误)?

  • 如果没有,是否有替代模式可以在狂野导入方面实现我想要的,但又不会混淆代码分析工具?

先发制人:我非常清楚不鼓励野生进口的事实。

【问题讨论】:

    标签: python aptana pydev code-analysis


    【解决方案1】:

    实际上,即使不是狂野导入,您也可能会遇到相同的错误(即:import settings / settings.MY_VARIABLE 仍然会显示错误,因为代码分析找不到它)。

    除了引用它的每个地方的@UndefinedVariableCTRL+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'),因为它可以让您更好地延迟加载您的偏好(即:不要在导入时加载,而是在第一次调用时加载)。

    【讨论】:

    • 首先:感谢您创建了 PyDev!作为开发人员,这可能是我生命中最有用的代码之一! :) 其次,感谢其他建议。最后,我使用import settings as S 重构我的代码,然后在代码中使用S.<constant-name-here>。它对我来说足够简洁,并使代码更具可读性。
    【解决方案2】:

    您可以对错误使用 Ctrl-1 并选择 @UndefinedVariable 或在您想忽略错误的行上键入 #@UndefinedVariable

    您可以尝试添加要被 PyDev 解释器扫描的模块,方法是转到 Window > Preferences,然后转到 PyDev > Interpreter - Python。在库选项卡下,单击New Folder 并浏览到包含settings 的目录,然后单击Apply。希望 Pydev 能够找到您的包并识别大量导入的变量。

    【讨论】:

      猜你喜欢
      • 2011-04-01
      • 2015-02-25
      • 2013-01-20
      • 2012-05-02
      • 2016-04-25
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多