web-dev-qa-db-ja.com

Pythonファイルをインポートするときにダッシュを使用しても大丈夫ですか?

基本的にpythonファイルのような場合:

python-code.py

そして使用:

import (python-code)

インタプリタは構文エラーを出します。

それを修正する方法についてのアイデアはありますか? pythonファイル名にダッシュは違法ですか?

124
Joan Venge

PEP 8 、Pythonコードのスタイルガイド:

パッケージ名とモジュール名モジュールには、すべて小文字の短い名前を付ける必要があります。読みやすさを改善する場合は、モジュール名にアンダースコアを使用できます。 Pythonパッケージには、すべて小文字の短い名前を付ける必要がありますが、アンダースコアの使用は推奨されません。

モジュール名はファイル名にマッピングされ、一部のファイルシステムでは大文字と小文字が区別されず、長い名前が切り捨てられるため、モジュール名はかなり短く選択することが重要です。これはUnixでは問題になりませんが、コードが古いMacまたはWindowsバージョン、またはDOSに転送されるときの問題。

つまり、ファイルの名前を変更します:)

143

コードで注意すべきもう1つの点は、インポートは関数ではないということです。したがって、import(python-code)import python-codeこれは、既に述べたように、「import python minus code "」と解釈され、意図したものではありません。本当に名前にダッシュを含むファイルをインポートする必要がある場合、次のことができます。

python_code = __import__('python-code')

ただし、前述のとおり、これは実際には推奨されません。制御するファイルの場合は、ファイル名を変更する必要があります。

110
Rick Copeland

[〜#〜] tldr [〜#〜]

ダッシュはnot違法ですが、次の3つの理由で使用しないでください。

  1. ダッシュ付きのファイルをインポートするには特別な構文が必要です
  2. ダッシュ付きのモジュール名は誰も期待していません
  3. Pythonスタイルガイド の推奨事項に反しています

ダッシュ付きのファイル名をインポートする必要がある場合、特別な構文は次のとおりです。

module_name = __import__('module-name')

なぜ特別な構文が必要なのか興味がありますか?

特別な構文の理由は、import somename識別子somenameを使用してモジュールオブジェクトを作成しています(したがって、後でsomename.funcname)。もちろん module-nameは有効な識別子ではないため、有効な識別子を提供する特別な構文です。

module-nameが有効な識別子ではない理由がわかりませんか?

心配しないでください-私もしませんでした。役立つヒントを次に示します。これを見てくださいpython line:x=var1-var2。割り当ての右側に減算があるか、ダッシュ付きの変数名がありますか?

[〜#〜] ps [〜#〜]

他のすべての回答からの最も関連性のある情報と考えられるものを1か所に含めることを除いて、回答のオリジナルはありません

40
ndemou

問題はそれです python-codeは識別子ではありません。パーサーはこれをpythonマイナスcodeと見なします。もちろん、これはあなたが求めていることをしません。有効なpython識別子でもあるファイル名を使用する必要があります。-アンダースコア付き。

おそらく__import__ハックしますが、方法がわからない場合は、すべきではありません。 Pythonモジュール名は有効な変数名(「識別子」)である必要があります-モジュールがある場合はfoo_bar、Python(print foo_bar)。変な名前(print foo-bar->構文エラー)。

4
John Millikin

適切なファイルの命名が最善の方法ですが、python-codeが制御できない場合、__import__を使用するハックは、コピー、名前変更、または他の作成者のコードをいじるよりも優れています。ただし、試してみましたが、.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を作成しました。

0
Ale

On Python 3 use import_module

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

より一般的には、

import_module('package.subpackage.module')
0
e18r