【发布时间】:2019-11-21 13:55:12
【问题描述】:
在很多个月前忘记了我的一个入门课程后,我正在进入 Python ......我称之为代码
filedialog.askopenfilename(filetypes = (("TCX files","*.tcx"),("All files","*.*"))) # Works
它有效。我决定只想要 *.tcx 文件,所以我使用
filedialog.askopenfilename(filetypes = (("TCX files","*.tcx"))) # Doesn't work
和
filedialog.askopenfilename(filetypes = ("TCX files","*.tcx")) # Doesn't work
没有骰子 - 我明白了
“错误的文件类型“*.tcx”,应该是“typeName {extension ?extensions ...?}”
然后我试试
filedialog.askopenfilename(filetypes = [("TCX files","*.tcx")]) # Works
它有效。我对 Python 想要方括号中的列表没有意见,但是第一行是否有效? Python 对单元素列表的处理是否与 N>1 根本不同?或者可能只是 tkinter 的代码——模块(filedialog)可以处理多态输入?
【问题讨论】:
-
一个单项元组(不是列表)写成 (6,) 因为 (6) 只是被解析器视为 6(一些带有或不带有附加括号的表达式)。对于括号,没有歧义。
-
啊,谢谢@MichaelButscher - 这也可以解释为什么当我试图解决这个问题时,我在教程中看到
(6,)的元组。解析器的有趣选择。函数(方法?)文档说元组 - Python 是否非常宽容我向它发送列表的情况? -
@rnelsonee 正如我在回答中提到的那样,元组和列表都是可迭代的对象,它们具有相同的接口并在访问它们时给出相同的结果(但仅用于读取数据而不是修改它们),所以该功能适用于它们两者
-
除了空元组
()(否则不是有效的括号表达式)之外,创建元组的是逗号。只有当逗号可能被误认为另一个句法结构时才需要括号。考虑x = 3, 5,它将x绑定到一个包含3 和5 的元组。比较foo(3, 5)(调用带有2 个参数的函数)和foo((3, 5))(调用带有单个元组参数的函数)。 -
我相信
filetypes参数接受 any 元组的可迭代作为值。filedialog.askopenfilename(filetypes = ("TCX files","*.tcx"))的问题在于可迭代(一个元组)不包含元组,而是字符串。