仅将非None值作为参数传递给函数

时间:2018-11-23 08:01:05

标签: python python-3.x

我有一个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_namestore_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

2 个答案:

答案 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)