我发现有时很难命名模块而不会与后面的变量名冲突。例如,我有以下课程:
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
时,我经常需要确保它是模块或类名或某人的变量名。
关于如何命名模块以避免与后面的变量名冲突,是否有任何好的约定?
答案 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
希望这有帮助!