如何在Python中用pyephem的getattr()访问ephem.Body字段且不调用eval()
解决方案
当然有!完全可以通过两次调用getattr()来替代eval(),既安全又符合Python风格,还更简洁。
修改后的第二部分代码:
body = 'Sun' altaz = ['alt','az'] # 先获取天体类并实例化,避免循环里重复创建实例 body_instance = getattr(ephem, body)(o) for a in altaz: print(a, getattr(body_instance, a))
代码说明:
- 第一步
getattr(ephem, body):从ephem模块中取出名为body(这里是'Sun')的类,也就是ephem.Sun - 接着调用这个类并传入观察者对象
o,得到天体的实例body_instance - 最后循环
altaz列表,用getattr(body_instance, a)直接获取实例的alt或az属性,完全不需要eval()
这样不仅消除了eval()带来的安全风险(比如如果body或a是不可信输入的话,eval()会执行恶意代码),代码逻辑也更清晰易懂。
内容的提问来源于stack exchange,提问作者tom fowle
相关产品推荐
相关产品推荐

