首页 文章

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

提问于
浏览
-3

我有一个for循环,它返回一个值或None,具体取决于所选的字段 .

For Loop:

for fieldname, value in form.data.items():
    if value is not None:
        print(value)

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

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 作为参数传递 . 我怎么能只传递 non 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)

如果未选择任何字段,则返回抛出的“无”

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

2 回答

  • 0

    我建议你使用list-comprehension:

    你可以这样做:

    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)
    

    EDIT : 该错误是因为None已被写为值中的字符串,而不是对象,因此如果子句没有捕获它 .

    >>> 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)
    
  • 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)
    

    UPDATE 我've included the '无'检查并排除csrf_token . 请使用 and 运算符,而不是 or .

相关问题