在导入Python文件时使用连字符可以吗?

196 投票
7 回答
135519 浏览
提问于 2025-04-15 11:09

基本上,当我有一个像这样的Python文件:

python-code.py

然后我使用:

import (python-code)

解释器给我报了语法错误。

有没有什么办法可以解决这个问题?在Python文件名中,连字符是非法的吗?

7 个回答

109

简而言之

使用连字符(-)在文件名中并不是违法的,但有三个原因你最好不要这样做:

  1. 你需要特殊的语法来导入带有连字符的文件
  2. 大家都不习惯模块名里有连字符
  3. 这违反了Python风格指南的推荐

如果你确实需要导入一个带有连字符的文件名,特殊的语法是这样的:

module_name = __import__('module-name')

想知道为什么需要特殊语法吗?

需要特殊语法的原因是,当你写 import somename 时,你是在创建一个名为 somename 的模块对象(这样你可以后续用 somename.funcname 来使用它)。当然,module-name 不是一个有效的标识符,所以需要用特殊语法来给出一个有效的标识符。

不明白为什么 module-name 不是有效的标识符?

别担心,我当时也不明白。这里有个小提示:看看这行Python代码:x=var1-var2。你能在赋值的右边看到减法操作,还是看到一个带有连字符的变量名呢?

附言

我的回答没有什么新意,只是把我认为最相关的信息从其他答案中整理到了一起。

142

你代码中还有一点需要注意的是,import 不是一个函数。所以 import(python-code) 应该写成 import python-code。有些人已经提到过,这样写会被理解为“导入 python 减去 code”,而不是你想要的效果。如果你真的需要导入一个名字里有连字符的文件,可以这样做:

python_code = __import__('python-code')

不过,正如上面提到的,这种做法其实并不推荐。如果这个文件名是你可以控制的,最好还是改一下文件名。

211

你应该去看看 PEP 8,这是关于Python代码的风格指南:

包和模块名称:模块的名字应该简短,并且全部使用小写字母。如果用下划线能让名字更容易读,那可以用下划线。Python的包名也应该简短,全部小写,不过不太建议使用下划线。

因为模块名会和文件名对应,而有些文件系统对大小写不敏感,并且会截断长名字,所以模块名最好选得比较短。虽然在Unix系统上这不是问题,但在老版本的Mac、Windows或者DOS上可能会出现问题。

换句话说:给你的文件改个名字吧 :)

撰写回答