立即从生成器函数引发错误

问题描述 投票:0回答:1

我有一个 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 这只是一个愚蠢的片段示例,因此逻辑不一定有意义。当生成器函数被

称为
,而不是
被评估

时,是否有可能引发异常?

两件事
python
1个回答
0
投票

你说你愿意

验证,然后

生成
  1. 听起来它应该有两个功能。 打破一个
  2. _private
  3. 帮手。

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

语句 不知何故不小心粘贴在那里。

    

© www.soinside.com 2019 - 2024. All rights reserved.