web-dev-qa-db-ja.com

argparse引数をクラスに渡す方法

私は一般的なコーディングに非常に慣れていません。特にPython=です。私が作成したargparse引数を、正しい方法/推奨される方法で使用するためにクラスに渡す方法を学びたいと思っています。さらに、 Pythonを学習するために、私はOOPの方法で物事を行う方法を学習して、他のOOPタイプの言語の学習が少し簡単になるようにしています。

だからここに私がやろうとしていることのサンプルがあります:

import argparse

class passyourcliargstome():
    def __init__(self, whatdoiputheretogetmycliargs):
        #how do I get my cli args here?
        pass
    def otherfunctionsthatdothings():
        pass

if __name__ == '__main__':
    #grab the arguments when the script is ran
    parser = argparse.ArgumentParser(
         description='Make things happen.')
    parser.add_argument('-f', '--foo', action='store_true', default=False, help='here be dragons')
    parser.add_argument('-b', '--bar', action='store_true', default=False, help='here be more dragons')

    passyourcliargstome.otherfunctionsthatdothings()

それで、私はメインクラスの外でargparse引数を定義していて、それらをクラスの中にinside取得する方法を知りたいです。これはそれを行う正しい方法ですか? argparseを自分のクラスの関数にするだけですか?

ご支援、ご参考等をよろしくお願いいたします。

編集:11/16 2:18 EST

注:自分の質問に答えるのに十分な担当者がいないため、これが正しい答えを投稿する唯一の手段です。

さて、それは私にいくつかのことをしましたが、私は何とかこれをつなぎ合わせることができました。 RyPeckの回答は引数(コードに欠けているもの)を取得するのに役立ちましたが、その後コードをテストしようとしたときに、バインドされていないメソッドエラーが発生しました。それが何を意味するのか私にはわかりませんでした。私は自分のスクリーンネームに従っていると言っていましたか?

this を見つけて読むまで、実際にはクリックされませんでした。これが私の作業コードです。誰かがこれに追加する何かを持っている場合は、「あなたはまだそれを間違っています、この方法で正しい方法で行ってください」まで。ぜひ聞きたいです。それまでの間、ご協力いただきありがとうございます。

import argparse

class Passyourcliargstome(object):

    def __init__(self):
        #here's how I got my args here
        self.foo = args.foo
        self.bar = args.bar
    def otherfunctionsthatdothings(self):
        print "args inside of the main class:"
        print self.foo
        print self.bar

if __name__ == '__main__':
    #grab the arguments when the script is ran
    parser = argparse.ArgumentParser(description='Make things happen.')
    parser.add_argument('-f', '--foo', action='store_true', default=False, help='here be dragons')
    parser.add_argument('-b', '--bar', action='store_true', default=False, help='here be more dragons')

    args = parser.parse_args()
    print "args outside of main:"
    print args.foo
    print args.bar

    #this was the part that I wasn't doing, creating an instance of my class.
    Shell = Passyourcliargstome()
    Shell.otherfunctionsthatdothings()

引数なしでこのコードを実行すると、Falseが4回出力されます。クラスインスタンスの外で2回、クラスインスタンス内で2回。

18
some_noob

parser.parse_argsを使用してvarsでラップし、特別な argparse Namespace タイプを通常のPython dictに変換します。一般的には、このパターン:

def main():
  parser = argparse.ArgumentParser()
  parser.add_argument('foo')
  parser.add_argument('bar')
  args = parser.parse_args()
  args_dict = vars(args)

その後、明示的に、または一度にすべてのクラスまたは関数が受け取る引数に引数を渡すことができます。クラスの場合、必要な引数を明示的に書き込むのが最善です。そのようです:

class MyClass(object):
  def __init__(self, foo, bar):
    self.foo = foo
    self.bar = bar

  def Print(self):
    print self.foo
    print self.bar

これで、これら2つを次のようにまとめることができます。

import argparse

class MyClass(object):
  def __init__(self, foo, bar):
    self.foo = foo
    self.bar = bar

  def Print(self):
    print self.foo
    print self.bar

def main():
  parser = argparse.ArgumentParser()
  parser.add_argument('foo')
  parser.add_argument('bar')
  args = parser.parse_args()
  c1 = MyClass(args.foo, args.bar)
  args_dict = vars(args)
  c2 = MyClass(**args_dict)

c1c2の両方が作成されます。ただし、c1と同様に、クラスを明示的に作成するのが最善の方法です。

19
Dave

単純なforループは引数を渡すことができます(または属性を設定します):

    args_dict = vars(self.parser.parse_args())
    # using argparse arguments as attributes of this (self) class
    for item in args_dict:
        setattr(self, item, args_dict[item])

しかし...おそらくエレガントな方法は、argparseを使用してクラスを初期化し、名前空間によってクラスに直接設定することです。

  class Foo:
  def __init__(self)
      self.parser = ArgumentParser()
      self.parser.add_argument('-f', '--foo, default=False, action='store_true', help='foo or not?')
      self.parser.add_argument('-b', '--bar', default=0, action='store', help='set the bar')  
      self.parser.parse_args(namespace=self)

空の入力は次と同等です。

  class Foo:
  def __init__(self)
      self.foo = False
      self.bar = 0
5
Assaf-g

引数を追加した後、次のことを行う必要があります。

args = parser.parse_args()

Argsに出力すると、すべての引数が名前空間引数に含まれていることがわかります。

その後、そのようにそれらにアクセスできます-

print args.foo
print args.bar

そこから、通常の変数のように扱うことができます。詳細および詳細については、 argparseのドキュメント を参照してください。

2
RyPeck