【问题标题】:How to combine try/except in python into a pretty one liner?如何将 python 中的 try/except 组合成一个漂亮的衬垫?
【发布时间】:2013-09-11 14:26:28
【问题描述】:

为了制作具有多列的 CSV 文件,我有许多 许多

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

是否可以将这 4 行压缩为 1 或 2 行(主要是为了便于阅读代码)?我已经尝试过这个函数,但我还没有找到一种方法来传递不存在的东西。

def tryexcept(input):
    try:
        printlist.append(input)
    except:
        printlist.append('')

    return printlist

更新我应该提到'text'实际上是一个dict值,所以它应该看起来像

printlist.append(text['data'])

(以上更改)

【问题讨论】:

  • “传递一些不存在的东西”是什么意思?
  • 可能是函数调用中的if语句?
  • printlist.append(text) 时有什么异常?有什么问题的text 对象?
  • printlist.append(text) 不应抛出异常,除非未声明 textprintlist。我认为除了这个例外,你还有另一个问题。
  • @RickyA 抱歉,这是我要附加的 dict 值。我更新了原帖。

标签: python python-2.7 append try-catch except


【解决方案1】:

怎么样:

printlist.append(text['data'] if 'data' in text else '')

或者像@bruno desthuilliers 建议的那样更好:

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

[编辑]

对于嵌套字典,我通常使用字典选择器:

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

针对您的情况(当未找到其中一个键时附加 None):

printlist.append(DQ("data.someotherkey.yetanotherkey", text))

【讨论】:

  • 好的,谢谢。一旦我包含了字典部分,就非常简单了。
  • 阅读dict 的文档并改用text.get('data', '') 怎么样?
  • @bruno desthuilliers:这是第一个想到的。将包括您的完整性。
  • 如果值在两个字典键之外,你会怎么做?例如:文本['数据']['用户']
【解决方案2】:

有一个字典方法可以做到这一点,它可以让你指定任何默认值。

input = text.get('data', default='')

printlist.append(input)

它检查字典中是否存在键,如果不存在,则返回默认值。更多关于字典here.

【讨论】:

    【解决方案3】:

    试试这个简单的包装器:

    def execute_with_exception_handling(f):
        try:
            return f()
        except:
            raise
    

    然后你执行你的函数:

    def my_func():
        return 0 / 0
    
    execute_with_exception_handling(my_func)
    

    您还可以使用*args 向函数添加参数。你甚至可以使用装饰器……你可以用谷歌搜索,因为我不禁想起它是如何工作的。

    【讨论】:

    • @psny:这就是“raise”的意义所在;)用对你更有用的东西代替它。
    【解决方案4】:

    为什么需要传递不存在的东西?

    如果传入的值不是“None”(或任何其他不需要的值),您可以简单地调用函数。

    tryexcept( x ) if x is not None else None
    

    编辑: 您是否正在尝试查看变量是否已声明?如果是,解决此问题的一种方法是事先声明变量:

    x = None
    ...
    tryexcept( x ) if x is not None else None
    

    【讨论】:

    • 如果它不存在,我必须在列表中添加其他内容。
    • 你是想看看变量是否被声明了?
    • 不是变量,而是dict键/值
    猜你喜欢
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 2017-11-10
    • 2019-06-26
    • 2021-07-14
    • 2010-09-08
    相关资源
    最近更新 更多