Python用init文件中的变量和默认常量fi初始化类

2024-06-17 12:03:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类有一长串变量(至少有一打)。在模块中,我首先导入一个常量文件,其中包含一些helper方法和所有默认常量。在

^{1}$

问题:我希望在初始化类时能够指定一个文件,其中该文件包含myConstants.py中常量的子集。不在init文件中的变量将从默认值加载。比如:

^{pr2}$

我的想法是

from myConstants import *
from ConfigParser import SafeConfigParser

class SomeClass(ParentClass):
    def __init__(var1=VAR1, ..., varN=VARN, initFile=''):
        if initFile: 
            parser = SafeConfigParser().read(initFile)
            var1 = parser('constants', 'var1') if parser('constants', 'var1') else VAR1
            var2 = parser('constants', 'var2') if parser('constants', 'var2') else VAR2
            ....
            varN = parser('constants', 'varN') if parser('constants', 'varN') else VARN
        else:
            var1 = VAR1
            ...
            varN = VARN

        super(SomeClass, self).init(var1, ...)
        self.varM = varM

问题:这是最好的方法吗?如果没有,那是什么?好像有点长篇大论。我也没有嫁给ConfigParser。在


Tags: 文件方法parserifinitelse常量constants
3条回答

我将使用两个独立的构造函数,一个接受文件,另一个接受显式参数。在

class SomeClass(ParentClass):
    @classmethod
    def from_file(cls, init_file):
        parser = SafeConfigParser()
        parser.read(init_file)
        var1 = parser.get('constants', 'var1') if parser.has_option('constants', 'var1') else VAR1
        # likewise var2, ..., varN
        # This results in a call to cls.__init__
        return cls(var1, var2, ..., varN)

    def __init__(var1=VAR1, ..., varN=VARN, initFile=''):            
        var1 = VAR1
        ...
        varN = VARN

        super(SomeClass, self).init(var1, ...)
        self.varM = varM

x = SomeClass(1, 2, 3)
y = SomeClass.from_file(config_file)

您可以尝试使用configparser对象,并使用默认值字典对其进行修改以满足您的需要:

default_values = {
    "var1": "42",
    "var2": "23",
}

conf_parser = configparser.ConfigParser()
conf_parser.read(config_file)

for var, default_value in default_values.keys():
    if v not in conf_parser["DEFAULT"]:
        conf_parser["DEFAULT"][var] = default_value

这将覆盖configparser中所有丢失的值。 之后,您只需传递configparser对象并使用config_parser["DEFAULT"]["var1"]等方法访问所有变量。你有一个好的构造器参数,你有一个整齐地捆绑在一起的参数。在

另一方面,这有点难看,而且配置解析器只知道如何处理字符串,所以字典可能更适合这个任务。在

我希望这有帮助。在

伙计,这个ConfigParser清楚地显示了它的年龄- 它肯定应该有一个映射接口-我不得不戳了一下 想办法得到它的价值-但这是一个更合适的 为您准备的代码:

class SomeClass(ParentClass):
    options = {"var1": VAR1, "var2": VAR2, ...} 
    def __init__( initFile='', **kwargs):
        options = self.__class__.options.copy()
        if initFile: 
            parser = SafeConfigParser().read(initFile)
            for option_name in parser.options("constants"):
                if options_name in options:
                    options[option_name] = parser.get("constants", option_name)
        else:
            for key, value in kwargs:
                if key in options:
                    options[key] = value

        super(SomeClass, self).init(**options)
        self.varM = varM

相关问题 更多 >