当前位置: 首页 > news >正文

Python使用rosbag使用getattr只能获取一层的数据,不能直接获取多层数据例如 a.b.c.d。使用for range写一个递归用来获取多层数据

使用`for`循环和`range`来遍历属性列表确实是一个更简单直观的方式,特别是不需要考虑性能优化和异常处理时。以下是使用`for`循环代替递归的示例代码:

 

```python

def get_nested_attr(obj, attr_str):

    attrs = attr_str.split('.')

    for attr in attrs:

        # 尝试获取下一个属性,如果属性不存在则返回None

        obj = getattr(obj, attr, None)

        if obj is None:

            return None

    return obj

 

# 示例使用

class NestedObject:

    def __init__(self):

        self.a = NestedObject()

        self.a.b = NestedObject()

        self.a.b.c = NestedObject()

        self.a.b.c.d = 'Hello, world!'

 

obj = NestedObject()

value = get_nested_attr(obj, 'a.b.c.d')

print(value) # 输出: Hello, world!

```

 

在这个例子中,我们直接遍历`attrs`列表中的每个属性名,并使用`getattr`来尝试获取每个属性。如果在某个点上属性不存在,`getattr`将返回我们指定的默认值`None`,并且我们立即返回这个`None`值。如果所有的属性都被成功获取,函数将返回最内层的属性值。

 

这种方法的好处是代码更简洁,易于理解,并且对于大多数情况来说性能也是足够的。然而,对于非常大的属性链或者性能要求极高的场合,递归方法可能会需要一些优化来避免栈溢出或提高性能。但对于大多数常规用途,使用`for`循环通常是足够好的解决方案。

相关文章:

  • SmartEDA:革新电路设计,体验前所未有的创新乐趣!
  • CVE-2022-4230
  • 【TB作品】MSP430F149 单片机 音乐喷泉
  • Spring Cloud工程添加子模块打包后文件为war包而非jar包
  • C语言小例程6/100
  • 【Linux】线程控制
  • MongoDB CRUD操作:地理位置查询
  • 操作系统教材第6版——个人笔记6
  • WPF国际化的最佳实践
  • SASS模块化与组织文件
  • 5-Maven-setttings和pom.xml常用配置一览
  • c#vb代码互转工具
  • SpringBoot+Vue校园管理系统(前后端分离)
  • MySQL分页:ROW_NUMBER() vs LIMIT
  • 【JMeter接口测试工具】第一节.JMeter简介和安装【入门篇】
  • ES6指北【2】—— 箭头函数
  • #Java异常处理
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • CentOS7简单部署NFS
  • Java Agent 学习笔记
  • OSS Web直传 (文件图片)
  • Redux系列x:源码分析
  • SpiderData 2019年2月16日 DApp数据排行榜
  • spring security oauth2 password授权模式
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 基于 Babel 的 npm 包最小化设置
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前端攻城师
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 世界上最简单的无等待算法(getAndIncrement)
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 如何用纯 CSS 创作一个货车 loader
  • # Maven错误Error executing Maven
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (六)vue-router+UI组件库
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (四)库存超卖案例实战——优化redis分布式锁
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)基于IDEA的JAVA基础12
  • .net core 的缓存方案
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET简谈设计模式之(单件模式)
  • .NET上SQLite的连接
  • .NET值类型变量“活”在哪?
  • //解决validator验证插件多个name相同只验证第一的问题
  • /etc/sudoer文件配置简析