【问题标题】:How do I get pylint to recognize MySQLdb members?如何让 pylint 识别 MySQLdb 成员?
【发布时间】:2017-10-09 23:09:47
【问题描述】:
import MySQLdb

try:
    dbcon = MySQLdb.connect(host=host_name, user=user_name,
                                     passwd=password, db=db_name)
except MySQLdb.Error:
    pass

收到此 pylint 警告 模块“MySQLdb”没有“错误”成员(无成员)

【问题讨论】:

    标签: python-2.7 python-3.x mysql-python pylint mysqldbcompare


    【解决方案1】:

    最好的:

    使用extension-pkg-whitelist option

    可以从中加载 C 扩展的包或模块名称的逗号分隔列表。扩展正在加载到活动的 Python 解释器中,并且可以运行任意代码

    --extension-pkg-whitelist=_mysql
    

    PyLint 解析(默认情况下)源文件,但在 Python 中,模块的形状可以在运行时从源文件中定义的形状改变。此选项告诉PyLint 实际导入指定模块,并使用运行时定义。

    请注意,由于 MySQLdb 包包含 C 扩展,因此您必须传递 C 扩展的名称 (_mysql) 而不是包名称 (MySQLdb)。 (source)


    还不错:

    使用unsafe-load-any-extension option

    允许加载任意 C 扩展。扩展被导入到活动的 Python 解释器中,并且可以运行任意代码。

    --unsafe-load-any-extension=yes
    

    您可以使用unsafe-load-any-extension 选项,但这会加载每个可用的扩展,以及它的(潜在危险的)初始化代码。 extension-pkg-whitelist 更安全,因为它只加载指定的模块。


    最坏的情况:

    使用disable option

    # pylint: disable=no-member
    

    这并不能真正解决问题,只会让PyLint 沉默。


    感谢 PyLint 的维护者 @PCManticoreHere是维护者的评论。

    感谢@ZevSpitz最佳答案和这个不错答案的贡献者。

    【讨论】:

    • 我建议稍微澄清一下:因为它需要实际的 C 扩展,但需要 Python 包装器。 -- 它需要 C 扩展还是 Python 包装器?
    【解决方案2】:

    使用--extension-pkg-whitelist option可能会有所帮助:

    --extension-pkg-whitelist=_mysql
    

    pylint 解析(默认情况下)源文件,但在 Python 中,模块的形状可以在运行时从源文件中定义的形状改变。此选项告诉 pylint 实际导入指定的模块,并使用运行时定义。

    请注意,由于 MySQLdb 包包含 C 扩展,因此您必须传递 C 扩展的名称 (_mysql) 而不是包名称 (MySQLdb)。 (source)

    您可以使用unsafe-load-any-extension 选项,但这会加载每个可用的扩展,以及它的(潜在危险的)初始化代码。 extension-pkg-whitelist 更安全,因为它只加载指定的模块。

    【讨论】:

    • 正如我在回答中提到的,应该是--extension-pkg-whitelist=_mysql,而不是MySQLdb
    • @soundlake 目前我的回答没有为您的回答添加任何信息;但我觉得它更好地呈现,并且没有明确的编辑历史。如果您可以接受此答案,建议您将其复制并粘贴到您的答案中,我将删除我的答案。
    • 感谢您的友好建议。为了存档,我把你的答案复制到我的里面,并添加了一些装饰。
    • @soundlake 您无需担心存档;问答的整个历史is stored in SO。此外,虽然非常感谢感谢和信任,但它们在 SO 上被认为是不合适的——应该对有价值的问题和答案进行投票。也许在 cmets 中,或者最多在 ` 标签中的一个注释。
    猜你喜欢
    • 2013-12-31
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多