如何在 Python 3 中的内部 class 中动态初始化 object?

How to dynamically initialize an object within an inner class in Python 3?

我正在利用 InfluxDB 库的 SeriesHelper object(请查看 https://influxdb-python.readthedocs.io/en/latest/examples.html#tutorials-serieshelper)将数据点集推送到 InfluxDB。 SeriesHelperclass需要继承,childclass需要初始化各种object作为元属性,这样在 Parent class.

中覆盖 object 的默认值

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_name' object 在 运行 作为脚本之前被初始化(hard-coded)。我的用例是根据传递给此脚本的运行时参数初始化 'series_name'。 我尝试定义一个全局变量,其值在运行时提供,并将该全局变量分配给 'series_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'

它推断 object 'series_name' 没有用值初始化。有什么方法可以正确初始化它吗?

python interpreter 遍历代码(逐行)时,它定义了所有 classes 静态变量。 它是在您从 class 创建实例之前设置的静态变量。 这意味着当您到达以下位置时:

autocommit = True

series_name 的值已经设置为 None(因为那是 series_configured 在该点的值)。

以下示例显示 static 变量在我创建实例之前已经设置:

>>> 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 static 变量,您必须在 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()