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

Joa*_*nge 132 python naming

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

python-code.py
Run Code Online (Sandbox Code Playgroud)

并使用:

import (python-code)
Run Code Online (Sandbox Code Playgroud)

解释器给我语法错误.

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

Pao*_*ino 147

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

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

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

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

  • 这个问题与样式无关,它是一个_syntax_ _error_ (67认同)
  • 当您明确要阻止导入时,在Python目录和文件名中使用连字符会非常有用.例如,在(例如)Django项目中,您可能使用Python编写的脚本不应该作为应用程序进行寻址.您可以将它们放在像`ops-scripts`这样的文件夹中,并且知道它们不能使用普通的包命名空间方法导入.或者可以将单个脚本命名为"stop-website.py"以获得类似的效果.其中任何一个仍然可以通过`runpy`和其他一些方法导入,但这有助于避免一些常见错误. (4认同)
  • 如下所示,仍然可以使用具有此名称的文件,因此样式指南非常相关. (3认同)

Ric*_*and 113

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

python_code = __import__('python-code')
Run Code Online (Sandbox Code Playgroud)

但是,如上所述,这并不是真的值得推荐的.如果是您控制的内容,则应更改文件名.


nde*_*mou 45

TLDR

破折号不是非法的,但您不应使用它们有以下三个原因:

  1. 您需要特殊的语法来使用破折号导入文件
  2. 没有人希望模块名称带有破折号
  3. 这违反了Python样式指南的建议

如果您确实需要使用短划线导入文件名,则特殊语法如下:

module_name = __import__('module-name')
Run Code Online (Sandbox Code Playgroud)

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

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

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

别担心 - 我也没有.这里有一个提示可以帮到你:看看这条蟒蛇线:x=var1-var2.你看到作业右侧的减法或带破折号的变量名吗?

PS

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


Sin*_*ion 28

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

  • +1.从未想过Python源代码的文件名应该是有效的标识符,因为**文件名**将用于引用模块对象. (2认同)

e18*_*18r 9

在 Python 3 上使用import_module

from importlib import import_module
python_code = import_module('python-code')
Run Code Online (Sandbox Code Playgroud)

更普遍,

import_module('package.subpackage.module')
Run Code Online (Sandbox Code Playgroud)


Joh*_*kin 7

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