检查 class 上所有属性 ('@属性') 的值
Check the value of all properties ('@property') on a class
使用 Python 3.8,我希望识别用 @property
装饰的方法,然后检查这些属性的值以确保它们都具有字符串值,而不是 None
.
我的理由是未来将添加更多 @property
方法,我宁愿不必更新验证函数来获取和测试每个方法的值,所以我正在寻找一种使该过程自动化的方法。
我已经能够使用 的答案识别所有属性。
props = inspect.getmembers(type(self), lambda o: isinstance(o, property))
但是,我不确定如何处理已返回的元组列表。
[('certificate', <property object at 0x7f7aaecec400>), ('protocol', <property object at 0x7f7aac7d2f90>), ('url', <property object at 0x7f7aac7da040>)]
使用 props
中的元组列表,有没有办法调用属性并检查值?
我的解决方案
感谢接受的答案,这是我的解决方案。
class MyClass:
# Methods removed for brevity.
def _validate(self) -> None:
props = inspect.getmembers(type(self), lambda o: isinstance(o, property))
invalid_props = [p for p, _ in props if getattr(self, p) is None]
if invalid_props:
raise MyException(invalid_props)
您可以将 getattr
与 props
元组中的 属性 名称一起使用。
valid = [p for p, _ in props if getattr(self, p) is not None]
请记住,访问 属性 可能会执行任意代码,因此获取值本身可能会将值设置为 None
或不设置为 None
.
使用 Python 3.8,我希望识别用 @property
装饰的方法,然后检查这些属性的值以确保它们都具有字符串值,而不是 None
.
我的理由是未来将添加更多 @property
方法,我宁愿不必更新验证函数来获取和测试每个方法的值,所以我正在寻找一种使该过程自动化的方法。
我已经能够使用
props = inspect.getmembers(type(self), lambda o: isinstance(o, property))
但是,我不确定如何处理已返回的元组列表。
[('certificate', <property object at 0x7f7aaecec400>), ('protocol', <property object at 0x7f7aac7d2f90>), ('url', <property object at 0x7f7aac7da040>)]
使用 props
中的元组列表,有没有办法调用属性并检查值?
我的解决方案
感谢接受的答案,这是我的解决方案。
class MyClass:
# Methods removed for brevity.
def _validate(self) -> None:
props = inspect.getmembers(type(self), lambda o: isinstance(o, property))
invalid_props = [p for p, _ in props if getattr(self, p) is None]
if invalid_props:
raise MyException(invalid_props)
您可以将 getattr
与 props
元组中的 属性 名称一起使用。
valid = [p for p, _ in props if getattr(self, p) is not None]
请记住,访问 属性 可能会执行任意代码,因此获取值本身可能会将值设置为 None
或不设置为 None
.