【发布时间】:2016-05-26 20:40:03
【问题描述】:
我遇到了以下问题。
我的类中有一个视图属性,它可以访问配置,如果用户向配置中添加垃圾,则可以引发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
【问题讨论】:
-
您可以存储名称并改用
getattr(self, property_name)。 -
@karthikr:这很正常。我认为您没有正确阅读问题。
-
@VincentSavard 如何提取属性名称? name 似乎不适用于属性
-
num = getattr(self, "bar1")。等等......会做的伎俩。 -
@Altoyyr:您可以通过像
[property_name for property_name, obj in self.__class__.__dict__.items() if isinstance(obj, property)]这样的操作来获取所有属性名称。我会写一个答案。
标签: python list python-3.x properties