你能在python

时间:2017-09-01 07:53:13

标签: python

我有一个方法可以接受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

3 个答案:

答案 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中的任何一个,你的函数将使用你指定的默认值。