我有一个方法可以接受3个参数,但是如果它们没有传入,则从实例化对象中获取它们。以下是我设置的方法:
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。我想概述一下该方法需要的参数。
A
答案 0 :(得分: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 :(得分:0)
好的我可能会得到这个,但这是我提出的解决方案:
>>> 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
>>>
因此,无论在trythis类上定义了什么方法,当调用方法时,它们的参数都会自动设置在trythis对象上,并且将执行此操作的代码提取到元类中
答案 2 :(得分:-1)
使用kwargs args:
def getRepo(self, **kwargs):
repoName = kwargs.get('repoName', self.repo)
lcid = kwargs.get('lcid', self.lcid)
token = kwargs.get('token', self.nbwtoken)
使用kwargs将允许您将局部变量设置为通过函数调用的值,或者如果没有传递参数,则将其设置为默认值。
调用该函数时,您将调用它:
getRepo(repoName='SomeName', lcid='SomeID', token='SomeToken')
你也可以省略这些named parameters
中的任何一个,你的函数将使用你指定的默认值。