python - 字典没有识别正确的键
问题描述
我正在尝试使用文件扩展名字典来调用正确的方法来转换文件,但字典一直调用第一个键而不是正确的键。这是字典:
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 方法。知道为什么吗?
解决方案
一个简单的例子来说明这个问题:
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
and 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"
将始终计算为单个 string ".xlsx"
,因为在该表达式中 string-literal".xlsx"
是非空的,这意味着它将被视为“真实”值。一个or
表达式只需要它的一个操作数来True
使整个表达式为True
,因此,由于短路评估,整个表达式的计算结果为".xlsx"
。".xls"
这意味着字典不会考虑带有扩展名的文件。您必须为".xls"
.
推荐阅读
- python - 如何在 python django 中使用 * 替换电子邮件地址的某些字符
- java - authentication.getName() 在自定义 AuthenticationProvider 中返回 null
- sql-server - 从 VB.NET 备份 SQL Server 未生成备份文件,文件未显示在驱动器中
- c# - 凝视定时器完成后如何改变场景?
- docker - Docker端点其他撰写文件
- xslt - 在 Aspose.PDF XSLT 中定义表格边框的语法是什么
- c# - Xamarin TemplatedBinding 不适用于附加属性
- google-apps-script - 从一个电子表格复制/传输到另一个基于代码的
- sql - 使用日期范围和分组数据加入两个表
- regex - 正则表达式匹配 *RandomName($variable1, $variable2)