2017-09-01 11 views
0

私は3つのパラメータを取ることができるメソッドを持っていますが、それらが渡されないとインスタンス化されたオブジェクトからそれらを取ります。これを設定する方法は次のとおりです。Pythonで仮引数を反復することができます

def getRepo(self, lcid=None, token=None, repoName=None): 
    repoName=self.repo if repoName==None else repoName 
    lcid=self.lcid if lcid==None else lcid 
    token=self.nwbtoken if token==None else token 

良い方法はありますか?私は繰り返しコードを持っているようだ。私が議論を繰り返すことができれば、私はそれを行うことができます。私はメソッドが* argsか** kwargsを持つことを望みません。メソッドが必要とするパラメータを概説したい。

+0

'** kwargs'を使用したくない場合は、反復する。 –

+2

'None'のテストは' is'を使うべきです: 'repoName = self.repo if repoName is else else repoName'。 –

+4

引数が偽(0、空文字列、空リストなど)にならない場合は、単に 'or':' repoName = repoName or self.repo'を使用してください。 –

答えて

0

私はこのために予定が、ここで私が思いついた解決策になってしまうかもしれOK:メソッドは、インスタンスの属性が使用されているパラメータなしで呼び出されたときには、パラメータがONに設定されているのであれば

>>> class trythis: 
...  def __init__(self): 
...   self.firstvar=1 
...   self.secondvar=2 
...   self.thirdvar=3 
...   self.fourthvar=4 
...  def method1(self,firstvar=None,secondvar=None,thirdvar=None): 
...   kwargs=vars() 
...   for k, v in kwargs.iteritems(): 
...   if k != 'self': 
...    if v: 
...     setattr(self, k, v) 
...   print("firstvar {}".format(self.firstvar)) 
...   print("secondvar {}".format(self.secondvar)) 
...   print("thirdvar {}".format(self.thirdvar)) 
...   print("fourthvar {}".format(self.fourthvar)) 
... 
>>> a=trythis() 
>>> a.method1() 
firstvar 1 
secondvar 2 
thirdvar 3 
fourthvar 4 
>>> a.method1(firstvar=9) 
firstvar 9 
secondvar 2 
thirdvar 3 
fourthvar 4 
>>> 

メソッドを呼び出し、インスタンス変数が、ここで上記に拡大

に上書きされますが、これを達成メタクラスである:

>>> from functools import wraps 
>>> import inspect 
>>> 
>>> def setMethodAttrs(func): 
... @wraps(func) 
... def wrapper(*args, **kwargs): 
...  formalArgs=inspect.getargspec(func)[0] 
...  if len(args)>1: 
...   for x in range(1, len(args)): 
...    setattr(args[0], formalArgs[x], args[x]) 
...  for k, v in kwargs.iteritems(): 
...   setattr(vars()['args'][0], k, v) 
...  return func(*args, **kwargs) 
... return wrapper 
... 
>>> def classAttrs(cls): 
...  for key, val in vars(cls).items(): 
...   if callable(val): 
...    setattr(cls,key, setMethodAttrs(val)) 
...  return cls 
... 
... 
>>> 
>>> @classAttrs 
... class trythis: 
... def __init__(self): 
...  self.firstvar=1 
...  self.secondvar=2 
...  self.thirdvar=3 
...  self.fourthvar=4 
... def method1(self,firstvar=None,secondvar=None,thirdvar=None): 
...  print("firstvar {}".format(self.firstvar)) 
...  print("secondvar {}".format(self.secondvar)) 
...  print("thirdvar {}".format(self.thirdvar)) 
...  print("fourthvar {}".format(self.fourthvar)) 
... def method2(self, secondvar=None, fourthvar=None): 
...  print("firstvar {}".format(self.firstvar)) 
...  print("secondvar {}".format(self.secondvar)) 
...  print("thirdvar {}".format(self.thirdvar)) 
...  print("fourthvar {}".format(self.fourthvar)) 
... 
... 
... 
>>> a=trythis() 
>>> a.method1() 
firstvar 1 
secondvar 2 
thirdvar 3 
fourthvar 4 
>>> a.method1(firstvar=9) 
firstvar 9 
secondvar 2 
thirdvar 3 
fourthvar 4 
>>> a.method2(11) 
firstvar 9 
secondvar 11 
thirdvar 3 
fourthvar 4 
>>> a.method1(19, thirdvar=21) 
firstvar 19 
secondvar 11 
thirdvar 21 
fourthvar 4 
>>> a.method2(fourthvar=40) 
firstvar 19 
secondvar 11 
thirdvar 21 
fourthvar 40 
>>> 

だから、どんな方法が目に定義されていますe trythisクラスmethosが呼び出されたときにその引数がtrythisオブジェクトに自動的に設定され、これを行うコードがメタクラスに抽出されます

0

地元の人々()を使用してください。あなたの関数に基づいてhttps://docs.python.org/2/library/functions.html#locals

例:

def getRepo(self, lcid=None, token=None, repoName=None): 
    kwargs = locals() 
    repoName = kwargs.get('repoName', self.repo) 
    lcid = kwargs.get('lcid', self.lcid) 
    token = kwargs.get('token', self.nbwtoken) 
-1

使用kwargsから引数:kwargsからを使用して

def getRepo(self, **kwargs): 
    repoName = kwargs.get('repoName', self.repo) 
    lcid  = kwargs.get('lcid', self.lcid) 
    token = kwargs.get('token', self.nbwtoken) 

は、あなたが関数呼び出しを介して、または来ている値に、ローカル変数を設定することができますパラメータが渡されない場合は、デフォルト値に設定されます。関数が呼び出されると

、あなたはこのようにそれを呼び出します。またこれらのnamed parametersのいずれかを残すことができますし、あなたの機能はあなたで指定されたデフォルト値を使用します

getRepo(repoName='SomeName', lcid='SomeID', token='SomeToken') 

+0

私はkwargsを使いたくないと述べました。アイデアは、(私は私の最終的な答えでやったように)私がそれを理解したときにコードをメタクラスに抽出することでした – amadain

関連する問題