gpt4 book ai didi

python - 遍历属性列表

转载 作者:行者123 更新时间:2023-11-28 18:32:41 28 4
gpt4 key购买 nike

我遇到了以下问题。我的类中有一个 View 属性,它访问配置并在用户向配置中添加垃圾时引发 ValueError

我想编写一个方法来检查我的配置文件是否有错误,所以我想我查看列表中的每个属性并尝试访问它的值。因此,我不需要为每个属性复制 try-except

我尝试了以下代码,当然,它在创建列表时调用了属性,因此在我的尝试之外抛出了错误。
我的问题有优雅的解决方案吗?

import random


def load_config():
rand_number = random.randint(0, 9)
if rand_number == 5:
raise ValueError

return rand_number


class foo:
@property
def bar1(self):
return load_config()

@property
def bar2(self):
return load_config()

@property
def bar3(self):
return load_config()

@property
def bar4(self):
return load_config()

@property
def bar5(self):
return load_config()


def check_properties(self):
properties = [
self.bar1, //Exceptions are thrown here
self.bar2,
self.bar3,
self.bar4,
self.bar5,
]

for property in properties:
try:
num = property
except ValueError:
print("ValueError at " + property.__name__)

my_foo = foo()
my_foo.check_properties()

为了创建一个 mve,我用一个函数调用替换了属性体,并创建了一个随机 ValueError

最佳答案

你可以用这样的东西定义check_properties:

def check_properties(self):
properties = [property_name for property_name, obj in self.__class__.__dict__.items()
if isinstance(obj, property)]

for property_name in properties:
try:
getattr(self, property_name)
except ValueError:
print("ValueError at " + property_name)

它将尝试评估 getattr 中的属性。

这不适用于基类继承的属性。如果你使用继承,你可以使用像这样的辅助函数:

def get_property_names(cls, follow_inheritance=False):
property_names = []

for attr_name, attr in cls.__dict__.items():
if isinstance(attr, property):
property_names.append(attr_name)

if follow_inheritance:
for parent_class in cls.__mro__:
if parent_class != cls:
property_names.extend(get_property_names(parent_class, True))

return property_names

然后将check_properties定义为:

def check_properties(self):
properties = get_property_names(self.__class__, follow_inheritance=True)

for property_name in properties:
try:
getattr(self, property_name)
except ValueError:
print("ValueError at " + property_name)

关于python - 遍历属性列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35417803/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com