我正在尝试使用文件扩展名字典来调用正确的方法来转换文件,但字典一直在调用第一个键而不是正确的键。这是字典:
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 方法。知道这是为什么吗?
答案 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
>>>
作为字典构造的一部分,您显式调用函数 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
,因此,由于短路计算,整个表达式的计算结果为 {{1 }}。这意味着字典不会考虑带有扩展名 ".xlsx"
的文件。您必须为 ".xls"
创建一个单独的键值对。