python – 如何跨模块存储应用程序设置
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 如何跨模块存储应用程序设置,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1938字,纯文字阅读大概需要3分钟。
内容图文
![python – 如何跨模块存储应用程序设置](/upload/InfoBanner/zyjiaocheng/698/c191b148685f40258f020835bdfff482.jpg)
参见英文答案 > How to save application settings in a config file? 3个
我收到了一位离开我们公司的开发人员的项目.不太复杂,但看起来不太好.
所以这是一个问题:
应用程序有一些模块,一个是存储某些应用程序的“设置”.选项(不是所有可能的选项,简单地说两个:foo和bar).
启动应用程序时,它从命令行读取选项(使用argparse):
parser.add_argument('--foo', action='store_true')
parser.add_argument('--bar', action='store_true')
parser.add_argument('--baz', action='store_true')
然后它执行这个令人讨厌的事情:
for name, val in parser.parse_args(sys.argv[1:])._get_kwargs():
setattr(sys.modules['settings'], name, val)
第一:我认为这是肮脏的,非pythonic黑客.第二,使用这样的代码简直不方便,因为当我需要使用settings.baz时,IDE会抱怨它不存在.
此hack的目的是使命令行解析的选项在应用程序中进一步使用的所有模块中可用.
我正在考虑像singleton模式这样的东西,但我只在PHP中使用过一次,并且不知道python中是否有这个正确的解决方案.即使是这样,有人可以举例吗?
我是python中的菜鸟,所以请对我好心:)
谢谢.
附:我很抱歉我的英语可能出错
解决方法:
Python中的模块是单例对象,使用一个来存储其他模块使用的设置将是一个非常Pythonic
“讨厌的东西”的第二行只是设置名为settings的模块的属性,因此并不是那么糟糕.更糟糕的是第一行的_get_kwargs()部分正在访问parser.parse_args()返回的argparse.Namespace对象的私有属性,以获取从命令行解析的设置的名称和值.稍微好一点的方法可能是这样的:
import settings # possibly empty .py file
for name, val in vars(parser.parse_args(sys.argv[1:])).iteritems():
setattr(settings, name, val)
但是,这不会解决您的IDE问题,因为IDE不知道动态添加的设置的名称.解决这个问题的一种简单方法是在settings.py模块中使用某种默认值定义所有可能的属性,而不是使用空值.
第一次导入模块时,会将其条目添加到sys.modules字典中,其名称为键,types.ModuleType实例为值.后续导入将首先检查它的条目是否已经存在,并且如果有的话将跳过重新加载文件 – 这就是为什么我声称它们基本上是单例对象.对其属性进行的修改将立即显示给已导入它的其他模块或之后执行此操作,因此它通常是应用程序中的良好数据共享机制.
内容总结
以上是互联网集市为您收集整理的python – 如何跨模块存储应用程序设置全部内容,希望文章能够帮你解决python – 如何跨模块存储应用程序设置所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。