【问题标题】:Use 'pass' return value in another function in python在python的另一个函数中使用'pass'返回值
【发布时间】:2018-01-16 03:20:22
【问题描述】:

我正在使用 python 3.5。函数1是:

def boolean_key_validation(dictionary, key):
    data = {}
    try:
        dictionary_value = dictionary[key]
    except KeyError:
        pass
    else:
        if dictionary_value == 'TRUE':
            data[key] = True
        elif dictionary_value == 'FALSE':
            data[key] = False
        else:
            raise ValueError("{} value should be either blank or 'TRUE'/'FALSE' only".format(key))
    return data[key] # not able to get the 'do_nothing' value here

功能2是:

def read_file(start_date, end_date, dictionary):
    read_data = {}
    files = File.objects.all()
    # ... #
    read_data['downloaded'] = boolean_key_validation(dictionary, 'downloaded')
    read_data['integrity'] = boolean_key_validation(dictionary, 'integrity')
    read_data['validation'] = boolean_key_validation(dictionary, 'validation')

    return files.filter(**read_data)

我想根据“已下载”的布尔值等过滤模型“文件”。 在函数 1 中,我想要的是,如果字典中不存在键,则函数 1 不应该执行任何操作,函数 2 中的 read_data 字典应该没有该键的值。

我已经搜索过类似的问题,但那些在某些函数的条件语句中使用了“pass”。

编辑:

以下是我输入大量布尔值的主要功能,我必须为每个键编写单独的 try-catch。因此,创建了“boolean_key_validation”来验证那些大量的键并缩短我的主要功能。这里的“通过”正在完成它的工作,但我的 function1 无法给我这种回报。

如果字典中不存在键,我只想将其从 read_data 中省略。

def read_file(start_date, end_date, dictionary):
    read_data = {}
    files = File.objects.all()
    # try-catch for checking 'downloaded'.
    # have to write these conditions for other boolean values also and thats why created function1.
    try:
        dictionary_value = dictionary['downloaded']
    except KeyError:
        pass
    else:
        if dictionary_value.upper() == 'TRUE':
            read_data['downloaded'] = True
        elif dictionary_value.upper() == 'FALSE':
            read_data['downloaded'] = False
        else:
            raise ValueError("downloaded value should be either blank or 'TRUE'/'FALSE' only")
    # try catch for 'integrity' and 'validation' etc. #
     return files.filter(**read_data)

【问题讨论】:

  • 密钥没有值是指None
  • 不不不。我的意思是我在 function2 中的 files.filter() 将没有那个键来在 File 模型上应用过滤器。
  • 为什么不直接使用'downloaded' in dictionary.keys()?这会立即为您提供 True/False 值。
  • 我会试试这个。
  • @Idlehands,如果密钥不存在,那么我希望它省略进入我的过滤器()。 True/False 值将仅根据这些值进行过滤。我已经编辑了完整的上下文问题。如果还不清楚,请告诉我。

标签: python django dictionary


【解决方案1】:

我的看法是你把事情复杂化了,但是不知道你的代码应该做什么的全部范围,很难正确地评论它。

无论哪种方式,要实现您想要的,只需将pass 替换为return None,现在您的read_data 键应该只有3 种可能的状态:TrueFalse 或“无”。

def boolean_key_validation(dictionary, key):
    if key in dictionary.keys():
        if dictionary_value.upper() == 'TRUE':
            return True
        elif dictionary_value.upper() == 'FALSE':
            return False
        else:
            raise ValueError("{} value should be either blank or 'TRUE'/'FALSE' only".format(key))
    else:
        return None # return None if key is missing.

如果您返回的只是将dictionary_value 转换为布尔类型,则您根本不需要data = {}。您可能还想在 dictionary_value 上使用 .upper() 以消除区分大小写。我仍然不确定raise ValueError 我觉得你的程序应该实际处理这个问题,而不是仅仅引发错误并因此终止程序。但同样,在不知道意图的情况下很难发表评论。

如果你的字典应该只有TRUE/FALSE,它会让你的生活变得更轻松,你甚至可以把它放在一个循环中:

# ... #
    check_keys = lambda k: eval(dictionary[k].capitalize()) if k in dictionary.keys() else None
    key_list = ['downloaded', 'integrity', 'validation']
    for key in key_list:
        read_data[key] = check_keys(key)

编辑:根据您的最后一条评论,我将简单地更新函数 1 以将值分配给 read_data,而不是让它返回要单独分配的值:

def assign_data(data, dictionary, key_list):
    for key in key_list:
        if key in dictionary.keys():
            if dictionary[key].upper() in ('TRUE', 'FALSE'):
                data[key] = eval(dictionary[key].capitalize())
            else:
                raise ValueError("{} value should be either blank or 'TRUE'/'FALSE' only".format(
                    key))  # Maybe handle this instead of raising error

用法:

def read_file(start_date, end_date, dictionary):
    read_data = {}
    files = File.objects.all()
    # ... #
    keys = ['downloaded', 'integrity', 'validation']
    assign_data(read_data, dictionary, keys)

    return files.filter(**read_data)

例子:

dict = {1:'TRUE', 2: 'FALSE', 3: 'FALSE'}
keys = [1,2,3,4,5]
data = {}
assign_data(data,dict,keys)

# data = {1: True, 2: False, 3: False}

【讨论】:

  • 终于解决了。我根据您的建议修改了我的 function1,但最终使用了@Bhavani 解决方案。感谢您的宝贵时间。
  • 不客气。虽然我会争辩说,如果你想要的只是你的 read_data 中的 True/False,你应该修改你的函数 1 来处理分配,这样你就不必在之后手动删除 None 值。我已经用另一个建议更新了我的答案,请参阅我的编辑。
  • 用法和例子都不错。我学会了一种新的方法来解决同样的问题。感谢您的努力。
【解决方案2】:

由于您在不检查值的情况下分配boolean_key_validation 的返回值,因此无论如何都会在read_datadictionary 中创建条目,即使它的None. 也是如此

您可以做的是在构造read_data 字典后删除带有None 值的key

read_data = {k:v for k,v in read_data.items() if v is not None}
File.objects.filter(**read_data)

另一种方法是在boolean_key_validation 中引发KeyErrorValueError 并在填充read_data. 时捕获它

【讨论】:

    猜你喜欢
    • 2021-11-02
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2018-12-21
    • 2020-03-27
    • 1970-01-01
    • 2022-11-23
    • 2017-06-30
    相关资源
    最近更新 更多