对于枚举的子类,有没有办法在运行前在Pycharm中检测到AttributeErrors?
我有一个简单的子类Enum:
class ContentEncoding(Enum):
UTF_8 = "utf-8"
BINARY = "binary"如果我尝试访问一些不存在的字段,例如:
class ContentEncoding(Enum):
UTF_8 = "utf-8"
BINARY = "binary"
bar = ContentEncoding.fooPycharm没有像我预期的那样显示通常的"Unresolved attribute reference 'foo' for class ContentEncoding。在我的例子中使用枚举的全部原因是限制ContentEncoding可以接受的值。如果没有对此进行lint检查,那么首先使用Enum似乎是毫无意义的。
编辑:
添加此Enum子类的预期用例,希望存在替代解决方案:
此ContentEncoding类的预期用途是为其他编码器方法定义唯一有效的编码。
例如,假设此编码器方法如下所示:
def encode(obj, encoding: str):
return black_box_encoder(obj, encoding) 其中唯一有效编码字符串是"utf-8“或"binary”。所有其他字符串都会导致运行时错误。
因此,假设这个ContentEncoding类和encode方法位于某个名为mypackage的包中,并且我有一个用户导入了这个包,并希望对某些内容进行编码。
import mypackage
obj = "foo"
bar = mypackage.encode(obj, mypackage.ContentEncoding.UTF_8.value)而不是让用户手动键入"UTF-8“并容易出现像"Utf-8”、"utf-8“等这样的错误。我希望有一个枚举(或其他对象),而不是用来预定义第二个编码参数的唯一有效值。
我想最好是在ContentEncoding中输入提示,而不是字符串,然后在encode方法中提取值。例如:
def encode(obj, encoding: ContentEncoding):
return black_box_encoder(obj, encoding.value) import mypackage
obj = "foo"
bar = mypackage.encode(obj, mypackage.ContentEncoding.UTF_8)无论如何,我仍然没有看到在运行前对适当的编码字符串进行lint/error检查的方法。如果存在其他解决方案,请将我链接到我可以阅读的内容。
需要说明的是,如果用户执行以下操作,我想让Pycharm (或其他lint检查器)以某种方式警告用户他们使用了错误的arg (在运行前):
import mypackage
obj = "foo"
bar = mypackage.encode(obj, mypackage.ContentEncoding.utf_8)发布于 2021-09-22 09:11:03
PyCharm没有警告您的原因是因为您继承了实现__getattr__或__getattribute__方法的enum.Enum,而实现了此方法的类意味着属性访问是手动完成的,因此PyCharm无法警告您这一点。
class A:
def __getattr__(self, item):
return 1
class B(A):
pass
bar = B().foo
print(bar)结果为"1“,由于此工作是在__getattr__中动态完成的,因此PyCharm无法向我发出警告。
https://stackoverflow.com/questions/69281195
复制相似问题