【问题标题】:Dictionary not identifying the right key字典没有识别正确的键
【发布时间】:2021-04-01 00:23:45
【问题描述】:

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

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

【问题讨论】:

  • 在构建字典时,您正在转换文件(调用这些转换函数中的每一个)然后只返回一个。那是你想做的吗?
  • 哦,所以它会在构建字典时尝试调用每个函数?
  • 当您创建字典时,您正在显式调用conver_docs、conver_pdf 等所有函数。这些值不应该是那些函数返回的值,它们应该是函数本身。将键值对更改为 ".docx": conver_docs 等。另外,".xlsx" or ".xls" 不会按照您的想法执行。

标签: python python-3.x dictionary


【解决方案1】:

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

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

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

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

functions["a"]()

输出:

I'm in foo
>>> 

在我的示例中,foo 和 bar 不带参数,但您的 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,因此,由于短路计算,整个表达式计算为".xlsx"。这意味着字典不会考虑扩展名为 ".xls" 的文件。您必须为 ".xls" 创建一个单独的键值对。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-22
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多