Pythonic方法检查变量是否作为kwargs传递?

时间:2015-12-04 16:07:39

标签: python django

visible = models.BooleanField()
owner = models.ForeignKey(User, null=True)

def update_address(**kwargs):
    address = Address.objects.get(address=kwargs.get('address'))
    try:
        address.visible = kwargs.get('visible')
    except:
        pass
    try:
        address.owner = kwargs.get('owner')
    except:
        pass

update_address()应该不会导致address.visibleaddress.owner发生任何事情。

update_address(owner=None)应删除已设置的任何现有所有者对象。

令我困惑的是如何判断owner=None是否已明确设置,因此我知道要删除现有的所有者对象,或者是否在没有设置owner的情况下调用它我应该保留所有者的原样。

3 个答案:

答案 0 :(得分:8)

您可以使用“in”关键字检查密钥是否存在,或者您可以在get(key,default)函数的第二个参数中指定默认参数

if 'visible' in kwargs:
   do something

# OR

visible = kwargs.get('visible', False) 

更新:

如果你的super()类(即父模型)没有采用可见的param,你可以使用pop(key,default)来提取param,然后再将它传递给super。我认为这对你来说也很有用。

def __init__(self, *args, **kwargs):
   visible = kwargs.pop('visible', False)
   super().__init__(*args, **kwargs)

答案 1 :(得分:1)

您可以使用inkeys

if 'visible' in kwargs.keys():
    ...

答案 2 :(得分:0)

如果更方便,您也可以自己制作默认选项;通过创建object的实例,您可以确保它与其他任何内容不同

no_parm = object() # this object is only used for default parms

def thisfunc( p = no_parm ):
    if p is no_parm:
         # default was used

def thatfunc(**kwargs):
    rateval = kwargs.get('rate', no_parm)
    if rateval is not no_parm:
        # it could be None, if the functiion wa called
        # as thatfunc( rate=None)
        #
        ...

注意使用is进行比较 - 这是可能的 - 并且建议 - 因为我们检查是否有两个对完全相同对象的引用 - 而不是==的值相等。