21

このサイトを上から下まで検索しましたが、Python3x で必要なことを実際に達成する方法は 1 つも見つかりませんでした。これは単純なおもちゃのアプリなので、いくつかの単純なテスト ケースを assert で記述して、1 日で終了できると考えました。レポートなどを生成するので、コードが変更されてもおかしくないことを確認したいと思います。

私の現在のディレクトリ構造は次のとおりです:(関連する部分のみが含まれています)

project
  -model
     __init__.py
     my_file.py
     -test
       my_file_test.py

my_file_test.py に my_file.py をインポートするのにかなりの時間を費やしています。

私が言ったように。このサイトを上から下まで検索しましたが、解決策はありませんでした。私の Python のバージョンは、Fedora 17 で動作する 3.2.3 です。

以前に試みた試み: https://stackoverflow.com/questions/5078590/dynamic-imports-relative-imports-in-python-3 親フォルダーからのモジュールのインポート Python の相対インポートについて説明できる人はいますか? Python で相対インポートを実行する方法

ほぼすべての試行で、次のようなエラーが発生します。

ImportError: No module named * OR ValueError: Attempted relative import in non-package

ここで何が起こっているのか。SOおよびインターウェブ全体で受け入れられたすべての回答を試しました。ここでは特別なことは何もしていませんが、.NET/Java/Ruby プログラマーとして、これが直感性の絶対的な定義であることが証明されています。

編集:問題があれば、REPLにインポートしようとしているクラスをロードしようとしましたが、次のようになりました:

>>> import datafileclass
>>> datafileclass.methods
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
>>> x = datafileclass('sample_data/sample_input.csv')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'module' object is not callable

問題があれば...クラスの機能が機能することは知っていますが、インポートできないため、現在テストできません。将来的には、統合の問題が確実に発生します。(罪のない人を保護するために名前が変更されました) ライブラリのこの反復に必要な機能が数週間以内に得られます...どんな助けも役に立ちます. Ruby でやればよかったのですが、クライアントは学習体験として Python を望んでいます。

4

1 に答える 1

30

コードを次のように構成します。

project
  -model
    __init__.py
    my_file.py
  -tests
    __init__.py
    test_my_file.py

重要なことに、testsディレクトリはモジュール ディレクトリでもある必要があります (その中に空の__init__.pyファイルがあります)。

次に、test_my_file.py で を使用from model import my_fileし、最上位ディレクトリから を実行しpython -m tests.test_my_fileます。これはモジュールとして呼び出しtest_my_fileているため、Python はそのインポート パスを設定してトップ レベルを含めます。

さらに良いことに、pytest や noise を使用できます。実行py.testすると、テストが自動的に取得されます。

これがあなたの質問に答えていないことは承知していますが、Python の標準的な慣行に反対するよりも、それを使用する方がはるかに簡単になるでしょう。つまり、独自の最上位ディレクトリにあるテストを使用してプロジェクトを構築することを意味します。

于 2012-07-12T13:00:57.943 に答える