尝试导入时,可以在Python文件中使用破折号吗?

时间:2009-04-17 17:59:00

标签: python naming

基本上我有一个python文件,如:

python-code.py

并使用:

import (python-code)

解释器给我语法错误。

有关如何修复它的任何想法?破折号在python文件名中是非法的吗?

7 个答案:

答案 0 :(得分:139)

您应该查看PEP 8,Python代码样式指南:

  

包和模块名称模块应具有简短的全小写名称。如果提高可读性,则可以在模块名称中使用下划线。 Python包也应该有简短的全小写名称,但不鼓励使用下划线。

     

由于模块名称映射到文件名,并且某些文件系统不区分大小写并且截断长名称,因此选择模块名称相当短很重要 - 这在Unix上不是问题,但它将代码传输到较旧的Mac或Windows版本或DOS时可能会出现问题。

换句话说:重命名你的文件:)

答案 1 :(得分:107)

您的代码中需要注意的另一件事是导入不是函数。所以import(python-code)应该是import python-code,正如一些人已经提到的那样,它被解释为“import python minus code”,而不是你想要的。如果您确实需要在其名称中导入带破折号的文件,则可以执行以下操作::

python_code = __import__('python-code')

但是,如上所述,这并不是真的值得推荐的。如果你控制的话,你应该更改文件名。

答案 2 :(得分:34)

<强> TLDR

破折号非法,但您不应该出于以下原因使用它们:

  1. 您需要使用特殊语法导入带破折号的文件
  2. 没人希望模块名称带有破折号
  3. 反对Python Style Guide
  4. 的建议

    如果您确实需要使用破折号导入文件名,则特殊语法为:

    module_name = __import__('module-name')
    

    对我们为什么需要特殊语法感到好奇?

    特殊语法的原因是当您编写import somename时,您正在创建一个标识为somename的模块对象(以便稍后可以使用它somename.funcname) 。当然module-name不是有效的标识符,因此是提供有效标识符的特殊语法。

    您不明白为什么模块名称不是有效的标识符?

    不要担心 - 我也没有。以下是帮助您的提示:查看此python行:x=var1-var2。您是在分配的右侧看到减法还是用破折号看到变量名称?

    <强> PS

    我的答案中没有任何原创内容,除了包括我认为是一个地方所有其他答案中最相关的信息部分

答案 3 :(得分:25)

问题是python-code不是标识符。解析器将其视为python减去code。当然,这不符合您的要求。您将需要使用也是有效python标识符的文件名。尝试用下划线替换-

答案 4 :(得分:4)

你可以通过一些__import__ hack导入它,但是如果你还不知道怎么做,你就不应该。 Python模块名称应该是有效的变量名称(“标识符”) - 这意味着如果你有一个模块foo_bar,你可以在Python(print foo_bar)中使用它。您将无法使用奇怪的名称(print foo-bar - &gt;语法错误)这样做。

答案 5 :(得分:0)

尽管正确的文件命名是最好的方法,但是如果python-code不在我们的控制范围内,那么使用__import__进行的黑客攻击比复制,重命名或以其他作者的代码搞乱为佳。但是,我尝试了一下,除非我将文件重命名添加了.py扩展名,否则它不起作用。在查看了the doc以得出如何获取.py的描述之后,我得出了以下结论:

import imp

try:
    python_code_file = open("python-code")
    python_code = imp.load_module('python_code', python_code_file, './python-code', ('.py', 'U', 1))
finally:
    python_code_file.close()

它在第一次运行时创建了一个新文件python-codec

答案 6 :(得分:0)

在Python 3上,使用import_module

from importlib import import_module
python_code = import_module('python-code')

更普遍地

import_module('package.subpackage.module')