2015-12-04 3 views
4
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.visible или address.owner.Pythonic способ проверить, была ли переменная передана как kwargs?

update_address(owner=None) должен удалить все существующие объекты владельца.

Вещь, которая меня сбивает с толку, заключается в том, как определить, был ли явлен owner=None, поэтому я знаю, чтобы удалить существующий объект владельца, или если он был вызван без owner, настроенный на все, чтобы я оставил владельца таким, какой он есть.

ответ

8

вы можете использовать «в» ключевое слово, чтобы проверить, если ключ есть, или вы можете указать параметров по умолчанию во втором аргументе ГЭТ (ключ, по умолчанию) функция

if 'visible' in kwargs: 
    do something 

# OR 

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

Update:

если ваш супер() класса (то есть материнская модель) не принимает видимых параметров, вы можете использовать поп (ключ, defau lt), чтобы извлечь параметр, прежде чем передать его супер. Я думал, что это может быть полезно и вам знать.

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

Вы можете использовать in и keys:

if 'visible' in kwargs.keys(): 
    ... 
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 для сравнения - это возможно - и рекомендуется - так как мы проверяем, если у нас есть две ссылки на точно такой же объект - а не равен равенству как ==.

Смежные вопросы