0

为了制作具有多列的 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'])

(以上更改)

4

4 回答 4

2

关于什么:

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))
于 2013-09-11T14:52:20.810 回答
2

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

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

printlist.append(input)

它检查该键是否存在于字典中,如果不存在,则返回默认值。更多关于字典的信息在这里

于 2013-09-11T14:59:08.750 回答
0

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

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

tryexcept( x ) if x is not None else None

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

x = None
...
tryexcept( x ) if x is not None else None
于 2013-09-11T14:37:00.350 回答
0

试试这个简单的包装器:

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

然后你执行你的功能:

def my_func():
    return 0 / 0

execute_with_exception_handling(my_func)

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

于 2013-09-11T14:29:42.630 回答