如何将 Python 中的 try/except 合并成一条美观的单行代码?

在创建具有许多列的 CSV 文件时,经常会遇到这样的代码结构:
在这里插入图片描述

try:
  printlist.append(text['data'])
except:
  printlist.append('')

这段代码是为了检查字典 text 中是否存在键 'data',如果存在,则将它的值添加到 printlist 列表中,否则添加一个空字符串。这样的代码结构会重复出现很多次,使得代码难以阅读和维护。

2、解决方案

方法一:使用字典的 get() 方法

Python 字典有一个内置的方法 get(),它允许你指定一个默认值,如果字典中不存在某个键,则返回该默认值。我们可以使用这个方法来简化上述代码:

printlist.append(text.get('data', default=''))

这样,如果 text 字典中不存在键 'data',则 get() 方法会返回默认值 '',并将其添加到 printlist 列表中。

方法二:自定义函数

也可以创建一个自定义函数来简化代码:

def tryexcept(input):
    return input.get('data', default='')

然后,就可以使用这个函数来代替 try/except 块:

printlist.append(tryexcept(text))

方法三:使用迭代器

如果需要处理嵌套字典,可以使用迭代器来遍历字典,并使用 get() 方法来获取值。例如,以下代码演示了如何使用迭代器来获取嵌套字典中的值:

class TokenDataType:
    LIST = "list"
    DICT = "dict"

def _select_key(keyitt, data):
    try:
        new_key = keyitt.next()
    except StopIteration:
        return data
    if new_key["t"] == TokenDataType.DICT:
        return _select_key(keyitt, data[new_key["k"]])
    elif new_key["t"] == TokenDataType.LIST:
        return _select_key(keyitt, data[new_key["i"]])

def tokenize_query(query):
    tokens = []
    for token in query.split("."):
        token = token.strip()
        if token:
            ttype = TokenDataType.LIST if "[" in token else TokenDataType.DICT
            if ttype == TokenDataType.LIST:
                index = None
                if len(token) >= 3:
                    index = int(token.replace("[", "").replace("]", ""))
                tokens.append({"k":token, "t":ttype, "i":index})
            else:
                tokens.append({"k":token, "t":ttype})
    return tokens

def normalize_query(query=None, tokens=None):
    if tokens == None:
        tokens = tokenize_query(query)
    return ".".join([token["k"] for token in tokens])

def select(query, data, throw_exception_on_key_not_found=False):
    tokens = tokenize_query(query)
    try:
        return _select_key(iter(tokens), data)
    except Exception as e:
        if throw_exception_on_key_not_found:
            raise e
        return None

DQ = select

if __name__ == "__main__":
    test = {"bla":1, "foo":{"bar":2}, "baz":[{"x":1}, {"x":2}]}
    print(DQ(".bla", test))
    print(DQ("bla", test))
    print(DQ("nothere", test))
    print(DQ(".foo", test))
    print(DQ("foo.bar", test))
    print(DQ("baz", test))
    print(DQ("baz.[0]", test))
    print(DQ("baz.[1].x", test))
    print(DQ("baz.[2].x", test))

for your case (appends None when one of the keys is not found):
printlist.append(DQ("data.someotherkey.yetanotherkey", text))

这种方法可以处理任意嵌套的字典,并返回字典中指定键的值,或者返回默认值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值