176

基本的に、次のようなpythonファイルがある場合:

python-code.py

そして使用:

import (python-code)

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

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

4

7 に答える 7

196

Python コードのスタイル ガイドであるPEP 8を確認してください。

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

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

つまり、ファイルの名前を変更してください:)

于 2009-04-17T18:01:46.227 に答える
137

コードで注意すべきもう 1 つの点は、 import が関数ではないことです。すでに述べたように、意図したものではなく、「pythonマイナスコードをインポート」と解釈されるimport(python-code)はずです。import python-code名前にダッシュが含まれるファイルをインポートする必要がある場合は、次の手順を実行できます。

python_code = __import__('python-code')

ただし、前述のとおり、これはあまりお勧めできません。あなたが制御するものである場合は、ファイル名を変更する必要があります。

于 2009-04-18T01:06:18.467 に答える
87

TLDR

ダッシュは違法ではありませんが、次の 3 つの理由から使用しないでください。

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

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

module_name = __import__('module-name')

特別な構文が必要な理由に興味がありますか?

特別な構文の理由は、あなたが書くときimport somename、識別子を持つモジュールオブジェクトを作成しているsomenameためです(後でそれを eg で使用できますsomename.funcname)。もちろんmodule-name、有効な識別子ではないため、有効な識別子を与える特別な構文です。

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

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

PS

他のすべての回答から最も関連性の高い情報と思われるものを1か所に含めることを除いて、私の回答には独創的なものは何もありません

于 2016-06-15T09:52:47.933 に答える
35

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

于 2009-04-17T18:01:05.480 に答える
7

ハックしてインポートすることもでき__import__ますが、方法がわからない場合は、インポートしないでください。Python モジュール名は有効な変数名 (「識別子」) である必要があります。つまり、モジュールがある場合は、foo_barPython ( ) 内から使用できますprint foo_bar。変な名前ではできません ( print foo-bar-> 構文エラー)。

于 2009-04-17T18:03:29.560 に答える
3

適切なファイル名を付けることが最善の方法ですが、私たちの管理下にない場合は、他の作成者のコードをコピーしたり、名前を変更したり、いじったりするよりも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を作成しました。

于 2018-09-29T18:20:46.447 に答える