gpt4 book ai didi

Python:如何将要处理的对象成员(可能嵌套得更深)传递给函数?

转载 作者:太空宇宙 更新时间:2023-11-03 20:13:35 25 4
gpt4 key购买 nike

背景

我有一个包含列表成员 x 和 y 的对象字典的字典:

plot_data._trace_d = {
TraceType.A: {
'abc': TraceData(x=[ 0, 1, 2, 3 ], y=[10, 11, 12, 13])
'def': TraceData(x=[100, 101, 102, 103], y=[110, 111, 112, 113])
},
TraceType.B: {
'abc': TraceData(x=[1000, 1001, 1002], y=['x', 'y', 'z']),
'def': TraceData(x=[1010, 1011, 1012], y=['xx', 'yy', 'zz'])
}
}

我需要展平每条迹线,以便符合我的绘图工具(绘图),以便我有以下形式的列表:

# TraceType.A
x = [0, 1, 2, 3, 100, 101, 102, 103]
y = [10, 11, 12, 13, 110, 111, 112, 113]
plot(x, y, ...)

# TraceType.B
x = [1000, 1001, 1002, 1010, 1011, 1012]
y = ['x', 'y', 'z', 'xx', 'yy', 'zz']
plot(x, y, ...)

我当前的解决方案

使用字符串传递要展平的成员。

class TraceData:
def __init__(self, x, y):
x = []
y = []
# ...

class PlotData:
def __init__(self):
self._trace_d = {
TraceType.A: TraceData(),
TraceType.B: TraceData(),
}
# ...
def flatten_trace_data(self, trace_type, dimension): # HERE! dimension is a string
"""For a trace type, get the lists for all nodes and concatenate them
into a single list. Useful to build a single Plotly trace for multiple
nodes."""
flat_list = []
for node, td in self._trace_d[trace_type].items():
print("Flattening node %r dim %s" % (node, dimension))
flat_list += getattr(td, dimension)

return flat_list

plot_data = PlotData()
# ...
x = plot_data.flatten_trace_data(TraceType.A, 'x')

我想要什么

将维度参数作为字符串给出感觉很脏,感觉matlaby。有没有办法告诉成员函数对成员的给定参数执行某些操作?像这样的事情:

x = plot_data.flatten_trace_data(TraceType.A, TraceData.x)

我已经尝试过这个,因为为什么不呢,但是 TraceData 没有属性 'x'

有什么优雅的方法可以告诉展平函数要展平对象的哪个维度(在嵌套的嵌套字典中)?

最佳答案

使用 getattrib 尝试类似的操作。


def flatten_trace_data(self, trace_type, dimension):
"""For a trace type, get the lists for all nodes and concatenate them into a single list. Useful to build a single Plotly trace for multiple nodes."""
flat_list = []
for node, l in self._trace_d[trace_type].items():
print("Flattening node %r dim %s" % (node, dimension))
flat_list += getattr(l, dimension)
return flat_list

编辑 1,使用属性

class PlotData: 
def __init__(self):
self._trace_d = {
TraceType.A: TraceData(),
TraceType.B: TraceData(), } # ...

@property
def x_A(self):
flat_list = []
for node, td in self._trace_d[TraceType.A].items():
flat_list += td.x
return flat_list

编辑2

你想要实现的是这样的。

plot_data = PlotData()
x = plot_data.A.x
y = plot_data.A.y

这将是更Pythonic的方式。

为此,您需要重新考虑 TaceData、TraceType 和 PlotData 中的每个类。

关于Python:如何将要处理的对象成员(可能嵌套得更深)传递给函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58587572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com