如何将参数传递给由调用的类构造函数山药负荷_

2024-05-19 08:11:13 发布

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

我有一个描述我的对象的YAML文件

--- !MyData
name: theName
param: parameter
data_file: \\path\to\my\file.csv

我的代码如下

^{pr2}$

在初始化时,main使用它来加载数据

 with open(self.initFile, 'r', newline='') as ymlfile:
     for item in yaml.load_all(ymlfile):
         if type(item) is Load:
              ---- some post init code

一切正常,但是由于我的主代码已经知道了数据文件的完整路径,因为它与yaml在同一个目录中, 有没有办法只给出数据文件的名称而不使用完整路径,这样我就可以在不编辑yaml配置文件的情况下更改位置?因为数据文件是由通过调用的父类加载的全部加载函数我不知道如何给出一个告诉路径值的参数。在


Tags: 文件对象代码name路径yamlparameterparam
1条回答
网友
1楼 · 发布于 2024-05-19 08:11:13

在加载实例中动态获取变量path有许多不同的解决方案,包括:

  • 您可以创建一个加载工厂对象,并在load_constructor中设置工厂上的path,而不是直接调用Load。在
  • 您可以将load\u构造函数放入类的实例中,在该实例上设置path,并让它的__call__方法进行构造

您可以使用后者:

import ruamel.yaml as yaml

yaml_str = """\
 - !MyData
name: theName
param: parameter
data_file: file.csv
"""

class Parent:
    def __init__(self, name, data_file, path=None):
        self._name = name
        self._data_file = (path + data_file) if path is not None else data_file

class Load(Parent):
    def __init__(self, name="",
             param = "param",
             useDataFile=False,
             data_file = "none",
             path=None,
             **kwargs):

        super().__init__(name=name,
                         data_file = data_file, path=path)

class LoadConstructor:
    def __init__(self, path=None):
        self._path = None

    def set_path(self, path):
        self._path = path

    def __call__(self, loader, node):
        values = loader.construct_mapping(node, deep=True)
        values['path'] = self._path
        return Load(**values)

load_constructor = LoadConstructor()
yaml.add_constructor(u'!MyData', load_constructor)

# using the above:
# set the default path
load_constructor.set_path('/my/path/to/csv/')
# parse YAML documents
for item in yaml.load_all(yaml_str):
    if type(item) is Load:
        print('data file:', item._data_file)

请注意,我必须更改构造函数的第一个参数,否则无法构造MyData类型的YAML对象。如果您将param用作Load.__init__()的值,则需要定义{}(因为key当然很好),所以我引用了这一点。在

运行上面的(在Python3下)将为您提供:

^{pr2}$

相关问题 更多 >

    热门问题