如何命名模块而不与变量名冲突?

时间:2016-10-05 09:03:29

标签: python

我发现有时很难命名模块而不会与后面的变量名冲突。例如,我有以下课程:

class Petition(object):
    def __init__(self, signature_count_requirement):
        self._signature_count_requirement = signature_count_requirement

以及以下功能:

def check_if_someone_can_sponsor_a_petition(someone):
    pass

所以编写这样的代码是很自然的:

if check_if_someone_can_sponsor_a_petition(a):
    petition = Petition(3)

然后我想把函数和Petition类放到一个模块中。现在我该怎么称呼模块?模块petition的命名似乎很自然。但是,很容易与后面的变量名冲突:

import petition
if petition.check_if_someone_can_sponsor_a_petition(a):
    petition = petition.Petition(3)  # this is ugly.

datetime模块可能是更好的(更糟糕的?)示例。在代码中遇到名称datetime时,我经常需要确保它是模块或类名或某人的变量名。

关于如何命名模块以避免与后面的变量名冲突,是否有任何好的约定?

4 个答案:

答案 0 :(得分:2)

如果你不想,你不必使用这些合格的名字。例如,调用模块petitions可能会写

from petitions import Petition, check_if_someone_can_sponsor_a_petition

这会将名称复制到您的本地名称空间中,因此可以写出像

这样的内容
if check_if_someone_can_sponsor_a_petition(a):
    petition = Petition(3)  # this is no longer so ugly.

当然,如果您打算调用模块petition,那么拥有一个同名变量将是一个非常糟糕的主意......

答案 1 :(得分:1)

您的代码实际上不起作用,因为分配给局部变量petition意味着Python会将对该名称的所有引用视为本地,因此无法找到对该名称的全局引用模块,导致NameError。

您可以使用其他名称导入模块:

 import petition as petition_module

或者你可以直接导入你需要的东西:

 from petition import Petition, check_if_someone_can_sponsor_a_petition

如需更多清理,您可以考虑将check_if_someone_can_sponsor_a_petition作为请愿的类方法。

答案 2 :(得分:0)

不确定它是否是您的问题,但您可以使用' as '指令导入您的模块,以定义您为模块选择的本地名称:

import petition as pet

if pet.check_if_someone_can_sponsor_a_petition(a):
        petition = pet.Petition(3)

这可能会解决您的姓名冲突。

答案 3 :(得分:0)

类名应使用CapsWords约定编写,变量全部小写,函数小写带下划线。我认为很多人使用尾随下划线来避免命名混淆。它可能很丑,但这是PEP 8的惯例。请参阅下面的链接,了解命名约定部分。

https://www.python.org/dev/peps/pep-0008/#prescriptive-naming-conventions

希望这有帮助!