2017-11-05 5 views
0

私は多くのスクリプトが最終的にインポートする必要があるのpythonモジュールを作成する必要があります。カスタムPythonモジュールをインポートしています..なぜ、いくつかの要素だけが引き継ぎますか?

  • カスタムフォーマットと一定の引数を設定するために解析する(つまり、私の冗長とargsを助ける、とスクリプト間で一貫/すべてが視覚的に満足)をarg

私のカスタムモジュールは現在独立して動作していますが、今は進んでいますが、別のスクリプトに正しくインポートできないようです。 THATモジュールは、問題のない単純な変数定数を定義する別のモジュール(ver.py)をインポートします(バージョンコードは1つの場所にしか存在しません)。しかし、そのファイルを別のファイル(myexecutable.pyなど)にインポートして、追加の引数を解析するコードを追加しようとすると失敗します。また、私は現在作業しているすべてのファイルを含むdirに_ _init__.pyを持っています。

このコードは非常に変更されており、「部分的に動作しています」状態に戻すことはできませんが、エラーは発生しません。注目すべきは

#!/usr/bin/env python 
import argparse 
import par as pp ##par.py is my working parsing code 

pp.preq.add_argument('input', metavar=" INPUT.ext", type=argparse.FileType('rt')) 
pp.preq.add_argument('output', metavar=" OUTPUT.ext", type=argparse.FileType('wt')) 

を、私は実行ファイルではなく、インポートされたファイルの「説明」と「使い方」を定義するために期待しています:ここでは、エラーを投げていないものです。ここでインポートされたファイル(par.py)が持っているもののサブセットです:

class USAGEformat(argparse.RawTextHelpFormatter): 
     def add_usage(self, usage, actions, groups, prefix=None): 
       if prefix is None: 
         prefix = 'nameconstant '+v.VERSION+'\n\nUSAGE: '+prog 
       super(USAGEformat, self).add_usage(usage, actions, groups, prefix) 

parse = argparse.ArgumentParser(add_help=False, formatter_class=USAGEformat) 

preq = parse.add_argument_group("___________________\n++ COMPULSORY ARGS") 

私はArgumentParserと、より何を追加しようとすると、それは私のUSAGEformatクラスを認識しません。ある時点で、スクリプトを部分的に認識し、定義された使用法を使用しましたが、定義された記述や強制的な引数は使用しませんでした。彼らは単純であるとき、インポートするときに、なぜ私の変数のみが働いている..私はかかわらず、何をしたか

を把握することはできません:

VERSION = "v1.0" 

ではなく、彼らはより複雑であるとき、そしてなぜ私のクラスでは携帯していませんいずれにしても?私は、この仕組みが何であるかを理解していないと思っています。私はチュートリアル/ Googleで自分自身にこの言語を教えてきました。なぜなら私はコンピュータ科学者ではないから、いくつかの方向性は非常に高く評価されるはずです。

+0

あなたのコードを投稿するポイントが常にあります。あまりにも厄介な場合は、それをきれいにしてください。 [mcve]を投稿してください。 'version'がインポート可能だが' parser'はそうでない理由はありません。コードを見ずに間違いが何であるかを知ることは不可能です。 –

+0

ちょっと@SSS実際の痛みポイントを投稿すると役に立つでしょう:どのようにあなたがインポートしたいものを宣言し、どのようにそれらをインポートしています。 –

+0

@Rawingよく私の意図は主に何らかの方向性を得ることだったので、編集する前にコードを投稿する前に知っておくべきことがあるかどうかを知っています。私は自分自身を混乱させ、私のコードをもっと知識がなくても必然的ではないものに戻す価値があります。しかし、それは役に立つスタートです。私のコードを修正して追加する前に、フォローアップの質問をしてください。私が気づかないかもしれないモジュールのインポートに関する基礎的な概念はありますか? – SSS

答えて

0

あなたの前の質問およびコード:import par as pp

Fully customized Python Help Usage

、そのモジュールで定義されたすべての変数、クラスや関数は​​接頭辞でアクセスする必要があります。したがって、pp.parserは、インポート時に作成されたパーサオブジェクトです。 pp.preqは引数グループの1つです。

pp.USAGEformatはカスタムフォーマッタクラスです。しかし、parserが作成されても、parがインポートされても、このクラスのオブジェクトは作成されません。フォーマッタは、helpまたはusage( '-h'、pp.parser.print_help())を要求するときに、指定されたクラスから作成されます。

(編集)これは間違っていた:

このフォーマッタは、現在のネームスペース(インポート1)、ないpp 1からversionprogのようなグローバル変数がかかります。

フォーマッタはまだインポート名前空間からversionを取ります。

pp.version = '3.0' 

https://stackoverflow.com/a/47118317/901925で私の編集を参照)

あなたは、ファイルの末尾にversionを変更し、新しいprint_help()を行うことによってpre自体にこの動作をテストすることができます。しかし、私はしていることを変更することができます。ディスプレイに変更が表示されます。一方、インポート時には

pp.parserが作成されます。作成時に設定された属性pp.parser.descriptionを変更することができます。 pp.descriptionの設定や変更は行いません。

parser.print_help()を実行すると、parser.format_helpが呼び出され、parser._get_formatterが呼び出されます。そのメソッドはparser.formatter_classを使用してformatterオブジェクトを作成します。このオブジェクトは「塗りつぶされ」、「実行されます」。このアプローチには多くの柔軟性がありますが、混乱する可能性があります。

関連する問題