字典无法识别正确的键

时间:2021-03-31 16:06:38

标签: python python-3.x dictionary

我正在尝试使用文件扩展名字典来调用正确的方法来转换文件,但字典一直在调用第一个键而不是正确的键。这是字典:

def convertirV2(fichier):
    print(Path(fichier).suffix)
    choices = {
        ".docx": conver_docs(fichier),

        ".pdf": conver_pdf(fichier),

        ".txt": conver_txt(fichier),

        ".html": conver_html(fichier),

        ".xlsx" or ".xls": conver_xls(fichier),

        ".csv": conver_csv(fichier),

        is_binary(fichier): fichier

    }
    return choices.get(Path(fichier).suffix)

我可以确认我提供了正确的密钥(在这种情况下为 .html),但它仍然尝试调用 conver_docs 方法。知道这是为什么吗?

1 个答案:

答案 0 :(得分:4)

一个简单的例子来说明这个问题:

def foo():
    print("I'm in foo")

def bar():
    print("I'm in bar")

functions = {
    "a": foo(),
    "b": bar()
}

输出:

I'm in foo
I'm in bar
>>> 

作为字典构造的一部分,您显式调用函数 foobar,因为 ()。您可能希望字符串的键值对映射到函数本身,而不是这些函数在调用时返回的值:

functions = {
    "a": foo,
    "b": bar
}

functions["a"]()

输出:

I'm in foo
>>> 

在我的示例中,foobar 不接受任何参数,但您的 conver_... 函数接受。为方便起见,您只需在实际调用所需函数时传递参数:

choices = {
    ".docx": conver_docs,
    ".pdf": conver_pdf
    # ...
}

choices[Path(fichier).suffix](fichier)

此外,".xlsx" or ".xls": conver_xls(fichier) 并没有按照您的想法行事。表达式 ".xlsx" or ".xls" 将始终计算为单个字符串 ".xlsx",因为在该表达式中字符串文字 ".xlsx" 是非空的,这意味着它将被视为“真实”值. or 表达式只需要其操作数之一为 True,整个表达式为 True,因此,由于短路计算,整个表达式的计算结果为 {{1 }}。这意味着字典不会考虑带有扩展名 ".xlsx" 的文件。您必须为 ".xls" 创建一个单独的键值对。