我可以通过所有(dict.values())应用函数吗?

时间:2017-04-19 06:44:34

标签: python-3.x tkinter

我有一个tkinter条目和相应的StringVar的字典,我想检查它是否具有Truthy / Falsy值。我知道我可以在all()上编写我自己的版本,它可以遍历StringVar并使用.get()来访问值:

>>> from tkinter import *
>>> root=Tk()
>>> row={'new':{}, 'old':{}}
>>> row['new']['data']=StringVar(value='something')
>>> row['new']['non_data']=StringVar(value='')
>>>
>>> def my_all(StringVarIter):
...   for element in StringVarIter:
...     if not element.get():
...       return False
...   return True
... 
>>> my_all(row['new'].values())
False
>>> row['new']['non_data']=StringVar(value='something else')
>>> my_all(row['new'].values())
True

使用内置输入和tkinter功能是否有更清洁,更pythonic的方式?我正在思考这些问题,也尝试过滤(函数,可迭代)

>>> map(StringVar.get(),row['new'].values())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: get() missing 1 required positional argument: 'self'

但这甚至没有让我获得所有()

所需的迭代

1 个答案:

答案 0 :(得分:0)

你实际上与return write_f.name非常接近;错误是因为您在不提供实例的情况下调用类上的方法。 map(StringVar.get(), row['new'].values())的第一个参数应该是一个可调用的,它将可迭代的第二个参数中的每个项依次作为单个参数。

所以你实际上可以引用该方法,而不是试图调用它,并依次传递实例:

map

或使您自己的单参数可调用(您经常会看到map(StringVar.get, row['new'].values()) # ^ note no parentheses, we're not calling the method 用于此目的):

lambda