我有一个for循环,根据选择的字段返回一个值或None。
用于循环:
for fieldname, value in form.data.items():
if value is not None:
print(value)
下面给出的是 for循环的打印语句的输出:
store_name
None
store_location
None
我试图将上述循环语句的输出传递给如下所示的函数:
output = store_details() <<-- arguments to this function to only include non None items obtained from the above for loop statement
在上面的示例中,仅store_name
和store_location
应该作为参数传递。如何仅将非None 项目作为参数传递?请注意,列表参数每次可能会有所不同,因此我正在尝试构建此函数,以便store_details函数每次仅传递非None值。
更新:
以下是我尝试执行的循环。如果选择了所有字段(页面上有5个字段可供用户选择),则此方法很好用。
l = []
for fieldname, value in form.data.items():
if value is not None:
l.append(value)
print(l)
p = l[:-1]
output = store_details(*p)
如果未选择任何字段,则返回“ None”并抛出
psycopg2.ProgrammingError: column "none" does not exist in table
答案 0 :(得分:0)
实际上,您可以通过多种方式执行此操作。一个是字典理解:
fields = {field:value for field,value in form.data.items() if value != None and value != 'None' and field != 'csrf_token'}
output = store_details(**fields)
更新
我已包括“无”检查,并排除了csrf_token。请使用and
运算符,而不要使用or
。
答案 1 :(得分:0)
我建议您使用列表理解:
您可以执行以下任一操作:
output = store_details([value for fieldname, value in form.data.items() if not value == None])
或(您可以执行form.data.values()以仅检索字典的值)
output = store_details([value for value in form.data.values() if not value == None])
您还可以存储list-comprehension的值并将其传递:
l = [value for value in form.data.values() if not value == None]
output = store_details(l)
编辑:该错误是因为None作为值的字符串而不是对象被写入,因此if子句没有捕获它。
>>> a= dict([('store_name', 'None'), ('store_type', 'store_type'), ('store_location', 'store_location'), ('csrf_token', 'ImI0MzQyYzcwZDk5NTVmMGQxMWY5YTk3NDhmNTNkNzJmMjQ5NWIzZTIi.Dtllqg.-SXYDYkBmQiPjSmo01VnDgSbZrE')])
>>> del a['csrf_token']
>>> a
{'store_name': 'None', 'store_type': 'store_type', 'store_location': 'store_location'}
>>> [i for i in a.values() if not i == 'None']
['store_type', 'store_location']
>>>
如果您喜欢使用自己的代码,请进行以下更改:
l = []
a = form.data
del a['csrf_token'] # token field is removed
for fieldname, value in a.items():
if value is not 'None':
l.append(value)
print(l)
output = store_details(*l)