2015-10-13 67 views
1

我尝试坚持PEP8编码约定。我有一个叫main的包。包内有一个名为time的模块,里面有一个名为Time的类。现在我在为我的实际实例找到一个合适的名称时遇到了一些麻烦,因为time(通常是我的选择)已经被模块采用,并且如果以这种方式命名它,似乎会出现名称冲突。如何在Python中命名实例变量?

from main.time import Time 

time = Time() 
... 
if time.status == main.time.STOPPED 

也许我也把这个常量放在错误的模块中,但我认为最好让我的常量在它们所属的地方。这是在我的课Time(和main模块)中使用的一个常量,所以我可以确保我不会将它与用于播放器移动的另一个常量STOPPED混合使用。不幸的是我得到一个AttributeError: 'function' object has no attribute 'time'

这里最好的解决方案是什么?将常量重命名为TIME_STOPPEDPLAYER_STOPPED并将它们放入常量模块中?命名我的实例变量my_timetime_或类似的东西并不是我想要做的。 Pythonic的方式是什么?

+1

不清楚。请提供完整的代码和追踪 – Pynchia

+0

您的问题是,您无法访问'STOPPED',当然?我想你想'从main.time导入时间,STOPPED'。你也可以使它成为'Time'类属性,所以测试将变成'if time.status == Time.STOPPED:',进一步减少了'STOPPED'的播放器版本的不确定性。 – jonrsharpe

+0

尝试添加像这样的导入:'import main.time' –

回答

3

使用名称time是一个不错的选择,首先,不只是因为你已经有一个名为time模块,而且还因为有一个名为time一个标准库模块。不管怎样,这实际上不是你的问题(可能是与STL模块冲突,但你没有显示足够的代码)。错误AttributeError: 'function' object has no attribute 'time'意味着main(在main.time)是函数,而不是模块。您的行time = Time()不是这个原因,而是另一个函数对象在您的可执行文件中调用main

+0

'main.time'应该是导入的模块。我认为nameclash介于那个('main.time.STOPPED')和我的Time对象的'time'实例之间。不管怎样,那里的好点 - 所以我将模块重命名为'gametime',并将类重命名为'GameTime' 。不过,如果我使用'gametime = GameTime()',问题将保持不变。什么是你的名字的实例..也许我应该使用gametime_instance或game_time,然后以避免名称冲突... –

+0

@ freeDom-我只能重申,你的'时间'或'GameTime'实例的命名是可疑的,但*不*问题。在你的应用程序的作用域中有一个名为'main'的*函数*,这会影响'main'模块。 – MisterMiyagi

+0

噢,那就是那个?是的,在我的'__init__'模块里面我有一个'main'函数..也许模块名'main'也是一个非常糟糕的主意...... –