在运行时

时间:2017-01-10 15:11:09

标签: python

假设我们有一个未知类型的任意对象,我们希望访问与此对象关联的同等任意属性,查询为字符串名称。我正在寻找获得这个价值的最佳实践方法。

在伪代码/ Python中,我正在考虑的当前策略是这样的:

def access_attribute(obj, attr):
    if type(obj) == types.FunctionType:
        return access_attribute(obj(), attr)
    elif type(obj) == types.DictType:
        return obj.get(attr)
    # ... etc.

要考虑的几个项目:

  • 如果对象上不存在该属性会发生什么?我可以提出异常。
  • 该属性可能会深层嵌套。

我认为这是编程语言和DSL解释器必须解决的问题,但我不知道标准/普遍接受的最佳实践。

在运行时将自定义存储的DSL /代码传递给eval的想法已经被提出,但我想暂时避免使用这种特殊的解决方案而更喜欢Pythonic的解决方案。

1 个答案:

答案 0 :(得分:-1)

getattr(object, name[, default])似乎至少回答了你问题的前半部分和这一点:

  

如果对象上不存在该属性会发生什么?我可以提出异常。

我认为这是一种最佳实践,因为它是标准库的一部分。

关于你的第二点:

  

该属性可能是深层嵌套的。

解决方案是使用dir(object)(将列出对象的所有属性)并循环使用非dict对象,但我对“最佳实践”方面的信心不足这个解决方案。