模块名称重新定义了内置功能

4 投票
3 回答
4442 浏览
提问于 2025-04-16 03:41

我正在用Python制作一个游戏,我觉得把我的一个模块命名为'map'是合适的。我的导入方式通常是这样的:

from mygame import map

不过,pylint(一个检查代码的工具)告诉我,这样做会重新定义一个内置的东西。那大家通常是怎么处理这种情况的呢?我想到了几个选择:

1) 忽略pylint的警告,因为我反正不使用这个内置的map。

2) 改成:

import mygame

然后在我的代码中都用mygame.map来引用。

3) 把我的map模块改个名字,比如叫hexmap、gamemap等等。

我倾向于选择第二个方案,但我想听听其他人的看法。

3 个回答

1

选项2或3都可以用,不过我觉得最简单明了的办法是把map这个名字改一下,这样就不会搞混了。这样一来,你可以享受到直接用map而不是mygame.map的简洁,同时也不会遇到作用域的问题。而且,我觉得map这个名字有点不太具体,换个更明确的名字会更好。

2

引用自 PEP 20:

明确的比隐含的要好。
面对模糊的情况,拒绝猜测的诱惑。
应该有一种——最好只有一种——明显的方法来做这件事。

mygame.mapmap 更明确。mygame.boardmygame.terrainmygame.map 更不容易引起误解。猜测代码是在说 __builtins__.map 还是 mygame.map 是很可怕的,而且大多数情况下都是错的。

4

这个问题没有绝对的答案,大家的看法可能不同。

不过对我来说,选3是最合理的选择。真的,真的不要选1;覆盖内置函数几乎从来不是个好主意,而且在这种情况下会特别让人困惑。选2会好一些,但我觉得大家还是会期待任何叫做map的函数能做一些和内置函数类似的操作。

那要不要用mapping呢?

撰写回答