繁体   English   中英

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

[英]Is it ok to use dashes in Python files when trying to import them?

基本上当我有一个 python 文件时:

python-code.py

并使用:

import (python-code)

解释器给了我语法错误。

关于如何解决它的任何想法? python文件名中的破折号是非法的吗?

您应该查看PEP 8 ,Python 代码风格指南:

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

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

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

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

python_code = __import__('python-code')

但是,如上所述,这并不是真正推荐的。 如果文件名由您控制,您应该更改它。

TLDR

破折号并不违法,但出于以下三个原因,您不应使用它们:

  1. 您需要特殊的语法来导入带破折号的文件
  2. 没有人期望带有破折号的模块名称
  3. 它违反了Python 风格指南的建议

如果您确实需要导入带破折号的文件名,则特殊语法是这样的:

module_name = __import__('module-name')

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

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

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

别担心——我也没有。 这里有一个提示可以帮助你:看看这个 python 行: x=var1-var2 您是否看到赋值右侧的减法或带破折号的变量名称?

聚苯乙烯

除了在一个地方包含我认为与所有其他答案最相关的信息外,我的答案中没有任何原创内容

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

在 Python 3 上使用import_module

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

更普遍,

import_module('package.subpackage.module')

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

虽然正确的文件命名是最好的方法,但如果python-code不在我们的控制之下,使用__import__的 hack 比复制、重命名或以其他方式弄乱其他作者的代码要好。 但是,我尝试过,除非我重命名文件并添加.py扩展名,否则它不起作用。 在查看文档以推导出如何获取.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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM