如何在python3中动态初始化内部类中的对象?

2024-09-26 04:41:51 发布

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

我正在利用InfluxDB库的SeriesHelper对象(请查看https://influxdb-python.readthedocs.io/en/latest/examples.html#tutorials-serieshelper)将一组数据点推送到InfluxDB。必须继承SeriesHelper类,并且子类需要初始化各种对象作为其元属性,以便覆盖父类中对象的默认值。你知道吗

Actual code

class MySeriesHelper(SeriesHelper):
    """Instantiate SeriesHelper to write points to the backend."""

    class Meta:
        """Meta class stores time series helper configuration."""
        client = myclient
        series_name = 'rf_results'
        fields = ['some_stat', 'other_stat']
        tags = ['server_name']
        bulk_size = 5
        autocommit = True

在这里,'series\u name'对象在作为脚本运行之前被初始化(硬编码)。我的用例是基于传递给这个脚本的运行时参数初始化'series\u name'。 我试图定义一个全局变量,其值在运行时提供,并将该全局变量赋给下面的“series\u name”,但没有成功。你知道吗

Problematic code

series_configured = None
class MySeriesHelper(SeriesHelper):
    """Instantiate SeriesHelper to write points to the backend."""

    class Meta:
        """Meta class stores time series helper configuration."""
        client = myclient
        series_name = series_configured
        fields = ['some_stat', 'other_stat']
        tags = ['server_name']
        bulk_size = 5
        autocommit = True

def main():
    global series_configured
    series_configured = args.series_name

    MySeriesHelper(server_name='server_A', some_stat='Master server', other_stat='Controller')
    MySeriesHelper.commit()

if __name__ == "__main__":
    parser = argparse.ArgumentParser()

    parser.add_argument("--series_name", dest='series_name', 
                        help="The measurement to be used for storing the data points",required=True)
    args = parser.parse_args()
    main()

运行时出现的错误是

'NoneType' object has no attribute 'format'

它推断对象'series\u name'没有用值初始化。有没有办法正确初始化它?你知道吗


Tags: theto对象nameserversomemetastat
1条回答
网友
1楼 · 发布于 2024-09-26 04:41:51

python interpreter遍历代码(逐行)时,它定义了所有的类静态变量。 它是在从类创建实例之前设置的静态变量。 也就是说,当你达到以下程度时:

autocommit = True

series_name的值已经设置为None(因为这是series_configured的值)。你知道吗

下面的示例显示在创建实例之前已经设置了静态变量:

>>> series_configured = None
>>> class MySeriesHelper:
    """Instantiate SeriesHelper to write points to the backend."""

    class Meta:
        """Meta class stores time series helper configuration."""
        series_name = series_configured
        fields = ['some_stat', 'other_stat']
        tags = ['server_name']
        bulk_size = 5
        autocommit = True

>>> print(MySeriesHelper.Meta.series_name)
None

如果要更改Meta.series_configured静态变量,则必须在series_configured更改其内容之后设置它。你知道吗

尝试以下主要方法。你知道吗

def main():
    global series_configured
    series_configured = args.series_name
    # The following line will set the variable at the inner Meta class.
    MySeriesHelper.Meta.series_name = series_configured

    MySeriesHelper(server_name='server_A', some_stat='Master server', other_stat='Controller')
    MySeriesHelper.commit()

相关问题 更多 >