我有一个 python 类,它是包含许多变量和属性的数据文件的包装器。其中一些变量可能也有与其关联的属性,我希望能够使用生成器迭代这些属性。我希望能够在文件中不存在指定变量时引发异常,并在文件中存在该变量时生成属性。然而,问题是我更希望能够“立即”引发异常,但由于 Python 中的生成器函数是惰性求值的,因此只有在首次求值生成器时才会抛出异常。这基本上可以归结为以下几点:
class file:
def __init__(varlist: List[str], attrlist: Dict[str, Any]):
self.varlist = varlist
self.attrlist = attrlist
def loadvar(varname: str):
...
def attrs(varname: str = None):
if varname:
if varname not in self.varlist:
raise RuntimeError(f"{varname} is not a valid variable name")
yield from self.loadvar(varname).attrs()
yield from self.attrlist.keys()
datafile = file(['a', 'b','c'], {'d':1, 'e':2, 'f':3})
list(datafile.attrs('non-existent')) # <-- raises exception; good
attr = datafile.attrs('non-existent')) # <-- does not raise exception; bad
list(attr) # <-- does raise exception
这只是一个愚蠢的片段示例,因此逻辑不一定有意义。当生成器函数被
,而不是被评估
时,是否有可能引发异常? 做
两件事生成
_private
def attrs(varname: str | None = None):
if varname and varname not in self.vars:
raise RuntimeError(f"{varname} is not a valid variable name")
return _attrs1(varname)
def _attrs1(varname: str | None):
if varname:
yield from self.loadvar(varname).attrs()
yield from self.attrlist.keys()
attr()
本身并不是一个生成器, 但它返回
一个惰性生成器。 所以它立即被评估,然后调用者 挂在发电机上,它可以 闲暇时拨打
next()
。
PEP-8
class File:
def __init__(self, vars: list[str], attrs: dict[str, Any]):
self.vars = vars
self.attrs = attrs
即大写类名,小写
list
+
dict
在现代注释中,不需要提及“列表” 当注释已经在标识符中时 解释说。
另外,不确定为什么方法签名中缺少self
。
我只是假设你想谈论函数
(没有四空格缩进)和 class
语句 不知何故不小心粘贴在那里。