当前位置: 首页 > 面试题库 >

在config.py中提供全局配置变量的最Pythonic方法?

夏侯朝斑
2023-03-14
问题内容

在我对过度复杂的简单事物的无尽追求中,我正在研究最“ Pythonic”的方法来在Python egg包中的典型“ config.py
”中提供全局配置变量。

传统方式(啊,好吧,# define !)如下:

MYSQL_PORT = 3306
MYSQL_DATABASE = 'mydb'
MYSQL_DATABASE_TABLES = ['tb_users', 'tb_groups']

因此,以下列方式之一导入全局变量:

from config import *
dbname = MYSQL_DATABASE
for table in MYSQL_DATABASE_TABLES:
    print table

要么:

import config
dbname = config.MYSQL_DATABASE
assert(isinstance(config.MYSQL_PORT, int))

这是有道理的,但有时可能会有些混乱,尤其是当您尝试记住某些变量的名称时。此外,提供一个以 变量为属性*“配置”对象 可能更灵活。因此,从
bpython config.py文件开始,我 想到 了:
***

class Struct(object):

    def __init__(self, *args):
        self.__header__ = str(args[0]) if args else None

    def __repr__(self):
        if self.__header__ is None:
             return super(Struct, self).__repr__()
        return self.__header__

    def next(self):
        """ Fake iteration functionality.
        """
        raise StopIteration

    def __iter__(self):
        """ Fake iteration functionality.
        We skip magic attribues and Structs, and return the rest.
        """
        ks = self.__dict__.keys()
        for k in ks:
            if not k.startswith('__') and not isinstance(k, Struct):
                yield getattr(self, k)

    def __len__(self):
        """ Don't count magic attributes or Structs.
        """
        ks = self.__dict__.keys()
        return len([k for k in ks if not k.startswith('__')\
                    and not isinstance(k, Struct)])

和一个“ config.py”,该类导入该类,内容如下:

from _config import Struct as Section

mysql = Section("MySQL specific configuration")
mysql.user = 'root'
mysql.pass = 'secret'
mysql.host = 'localhost'
mysql.port = 3306
mysql.database = 'mydb'

mysql.tables = Section("Tables for 'mydb'")
mysql.tables.users = 'tb_users'
mysql.tables.groups =  'tb_groups'

并以这种方式使用:

from sqlalchemy import MetaData, Table
import config as CONFIG

assert(isinstance(CONFIG.mysql.port, int))

mdata = MetaData(
    "mysql://%s:%s@%s:%d/%s" % (
         CONFIG.mysql.user,
         CONFIG.mysql.pass,
         CONFIG.mysql.host,
         CONFIG.mysql.port,
         CONFIG.mysql.database,
     )
)

tables = []
for name in CONFIG.mysql.tables:
    tables.append(Table(name, mdata, autoload=True))

这似乎是在包内存储和获取全局变量的一种更具可读性,表达力和灵活性的方法。

有史以来最大的想法?应对这些情况的最佳实践是什么?什么是 您的 存储和获取全局名称和变量您的包内的方法吗?


问题答案:

我做了一次。最终,我发现简化的basicconfig.py可以满足我的需求。如果需要,您可以将命名空间与其他对象一起传递以供其引用。您还可以从代码中传递其他默认值。它还将属性和映射样式语法映射到同一配置对象。



 类似资料:
  • This is a list of variables that are always implicitly assigned to the . This is handy for making global variables or server variables available to all templates without having to manually assign them

  • null 我将把所有三个文件转换成标准格式(文件1格式--一个有4列的输出)。要转换为标准格式,我需要引用文件第一行中的头记录。因此,如果我的输入文件是256MB,并且调用了多个映射器,是否有任何方法使每个映射器可以引用一个全局变量(头信息)。 简而言之,是否有一种方法为所有调用我的配置单元UDF的映射器提供一个公共变量? 注意:UDF将在单个列表上运行,读取完整的行,然后将其写入下一个表HDFS

  • 但是我想存储一些复杂的对象,像这样 context-param不可能做到这一点,我还能在Java或Spring中使用什么?

  • 我需要在我所有的idea运行配置中使用一个环境变量。我目前使用run- 我试图设置env变量在我的linux系统使用在各种会话配置文件:,,,但是intellij在运行过程中似乎忽略了这些变量,即使当我从intellij内置终端启动时,它显示了正确的输出。 我也尝试使用intellij. env文件插件,然后设置在文件在项目根。也没起作用。

  • 问题内容: 我只想在多个地方使用a :不仅是视图和控制器,而且还包括和其他配置文件。 我不想要这样的事情:使用Config类加载配置文件;使用CI 等。 我只想声明一个给定的(它可以是一个常数,但我需要将它作为一个变量),并在所有地方绝对使用它。 实际上…我想知道CI引导程序中哪个PHP文件是第一个要解析的文件,因此我可以在其中引入我的全局变量…但不是核心/系统或不适当的文件,而是“最佳”适合此简

  • 本文向大家介绍Lua中的全局变量、非全局变量总结,包括了Lua中的全局变量、非全局变量总结的使用技巧和注意事项,需要的朋友参考一下 前言 Lua将其所有的全局变量保存在一个常规的table中,这个table称为“环境”。这种组织结构的优点在于,其一,不需要再为全局变量创造一种新的数据结构,因此简化了Lua的内部实现;另一个优点是,可以像其他table一样操作这个table。为了便于实施这种操作,L

  • 我使用的是swing,有一个函数(CreateAndShowGUI())可以监听上、左、右键的按下 现在,当我运行程序并按下任意键(向上、向左、向右、向下)时,我可以看到按下的键变量被设置为True。但当我试图在main中访问相同的内容时,按下的这个键的值为false。谁能帮我找出我错的地方吗?

  • 问题内容: 如何在Java中定义全局变量? 问题答案: 要定义全局变量,你可以使用静态关键字 现在你可以通过调用从任何地方访问a和b