你能用python迭代形式参数吗

2024-09-27 20:20:57 发布

您现在位置: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

有更好的方法吗?我好像有重复的代码。如果我可以反复检查这些参数,没有一个我可以做。不要用阿吉斯的方法。我想概述一下这个方法需要什么参数。在

A


Tags: 对象实例方法selftokennone参数if
3条回答

使用locals()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)

好吧,我可能会为此付出代价,但我想出了一个解决方案:

>>> 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
>>> 

因此,当不带参数调用方法时,将使用实例属性,但如果在方法调用上设置了参数,则实例变量将被覆盖

在上面展开的是一个实现这一点的元类:

^{pr2}$

因此,无论在trythis类上定义了什么方法,当调用方法时,它们的参数都会自动设置在trythis对象上,并且执行此操作的代码被提取到一个元类中

使用kwargs参数:

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

使用kwargs可以将局部变量设置为通过函数调用获得的值,或者在未传递参数的情况下将其设置为默认值。在

调用函数时,将按如下方式调用:

^{pr2}$

您也可以省略这些named parameters,您的函数将使用您指定的默认值。在

相关问题 更多 >

    热门问题