如何在 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()
我正在利用 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()