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

Python 仅将非None值作为参数传递给函数,python,python-3.x,Python,Python 3.x,我有一个for循环,根据所选字段返回值或无 For循环: 下面给出了for循环的print语句的输出: 我试图将上述循环语句的输出传递给一个函数,如下所示: output = store_details() <<-- arguments to this function to only include non None items obtained from the above for loop statement 如果未选择任何字段,它将返回一个“None”,并抛出 psycop

我有一个for循环,根据所选字段返回值或无

For循环:

下面给出了for循环的print语句的输出:

我试图将上述循环语句的输出传递给一个函数,如下所示:

output = store_details() <<-- arguments to this function to only include non None items obtained from the above for loop statement
如果未选择任何字段,它将返回一个“None”,并抛出

psycopg2.ProgrammingError: column "none" does not exist in table

实际上,你可以用很多方法来做到这一点。一是词典理解:

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_令牌。请使用and运算符,而不是or。

我建议您使用列表理解:

fields = {field:value for field,value in form.data.items() if value != None and value != 'None' and field != 'csrf_token'}
output = store_details(**fields)
您可以执行以下任一操作:

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])
您还可以存储列表理解的值并将其传递:

l = [value for value in form.data.values() if not value == None]
output = store_details(l)
编辑:错误是因为None已被写入值中的字符串,而不是对象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)

谢谢你的回复。我遇到了一个问题,其中键和值对都返回如下。{'store_name':'store_name'、'store_id':'None'、'store_location':'store_location'、'store_address':'None'、'csrf_token':'feferf'}我怎么能只返回值而排除所有非值呢?请您告知我怎么也不能传入最后一个键值对“csrf_token”:“feferf”我已经根据您的最新代码进行了修改,我得到了错误psycopg2.ProgrammingError:表中不存在列csrf_token…我已经用正确的代码更新了响应有条件的。检查它;感谢您的更新,尝试使用修改后的代码。。它抛出一个错误,说-TypeError:store\u details得到了一个意外的关键字参数'store\u id'。。store_id是我列表的第一栏谢谢你的回复。。我得到以下错误:psycopg2.ProgrammingError:syntax error at or or near]第1行:从表_name中选择[]如果您可以共享完整的代码或错误发生的位置,那就太好了。很难这样说谢谢您的回复。我尝试了你修改过的代码,发现如果选择了所有字段,它就可以正常工作。。但是,如果未选择其中一个字段,则会抛出错误psycopg2.ProgrammingError:表中不存在列none。。你能在这方面帮忙吗。。Thnx.在不删除csrf列的情况下尝试它。当我打印时,它返回一个列表['None','store_type','None','None','None','None','None','None','imi0mzqyzcwzdk5ntvmmgqxmwy5ytk3ndhmtnkjmjmjq5nwiztii.Dtl_hw.DfRbLFmI8JQ-kU56Z1wq1lPK514']。。稍后抛出一个表中不存在的错误列..form.data.items返回什么?@rarback,下面给出的是如果我选择几个字段将打印的内容。记录项目['store_name'、'None'、'store_type'、'store_type'、'store_location'、'store_location'、'store_location'、'csrf_token'、'imi0mzqyyzcwzdk5ntvmmgqxmwy5ytk3ndhntnknzjmmjmjq5nwiztii.Dtllqg.-SXYDYkBmQiPjSmo01VnDgSbZrE']
>>> 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)