首页 > 解决方案 > 字典没有识别正确的键

问题描述

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

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 方法。知道为什么吗?

标签: pythonpython-3.xdictionary

解决方案


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

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

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

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"将始终计算为单个 string ".xlsx",因为在该表达式中 string-literal".xlsx"是非空的,这意味着它将被视为“真实”值。一个or表达式只需要它的一个操作数来True使整个表达式为True,因此,由于短路评估,整个表达式的计算结果为".xlsx"".xls"这意味着字典不会考虑带有扩展名的文件。您必须为".xls".


推荐阅读