如何根据要解压到的变量数量解压不同的值
How to unpack different values depending on number of variables to unpack into
我正在绞尽脑汁思考如何根据要解压到的变量数量从 class 中有条件地解压变量,例如根据我在赋值左侧设置的数字,我得到了一组不同的变量解压。
例如,让我们考虑一个具有 x、y、z 以及纬度和经度位置的 class:
class LatLonOrXYZ:
def __init__(self, x, y, z, lat, lon):
self.x, self.y, self.z = x, y, z
self.lat, self.lon = lat, lon
def __iter__(self):
# not sure...
return iter([self.x, self.y, self.z, self.lat, self.lon])
现在我想实现如下目标:
pos = LatLonOrXYZ(x=0, y=1, z=2, lat=3, lon=4)
x, y, z = *pos # 0, 1, 2
lat, lon = *pos # 3, 4
是否有任何深奥的 python 魔法可以完成这类事情,还是我最好只写几个感觉如此不必要的方法?
一如既往,我们将不胜感激任何帮助、见解或建议:-)
这是完全可行的,但在您的示例中可能不是可迭代对象的最佳应用。
基本上,从您的可迭代对象中创建一个 list
,如 list([*pos])
,然后根据需要将其切片,例如 list([*pos])[0:3]
。
这是您的示例代码,它正在运行:
class LatLonOrXYZ:
def __init__(self, x, y, z, lat, lon):
self.x, self.y, self.z = x, y, z
self.lat, self.lon = lat, lon
def __iter__(self):
# not sure...
return iter([self.x, self.y, self.z, self.lat, self.lon])
pos = LatLonOrXYZ(x=0, y=1, z=2, lat=3, lon=4)
x, y, z = list([*pos])[0:3]
lat, lon = list([*pos])[3:5]
print(x, y, z)
print(lat, lon)
输出:
0 1 2
3 4
作为旁注,在您的示例代码中,您正在调用实际的 class 对象而不是 pos
实例。了解其中的区别很重要。
而不是:
pos = LatLonOrXYZ(x=0, y=1, z=2, lat=3, lon=4)
x, y, z = *LatLonOrXYZ # 0, 1, 2
lat, lon = *LatLonOrXYZ # 3, 4
您想做的是:
pos = LatLonOrXYZ(x=0, y=1, z=2, lat=3, lon=4)
x, y, z = *pos # 0, 1, 2
lat, lon = *pos # 3, 4
第一行创建一个基于 class 定义的对象,它是一个 instance
,或者使用您将要使用的 class
的结构和行为的对象作为代码中的一个位置。
考虑以下几点:
pos_1 = LatLonOrXYZ(x=0, y=1, z=2, lat=3, lon=4)
pos_2 = LatLonOrXYZ(x=4, y=3, z=2, lat=1, lon=0)
这是两个不同的对象,具有各自的特点,都按照 LatLonOrXYZ
class
的布局进行构造。基于相同蓝图的不同建筑物。
这是一个非常基本的描述,旨在指出事情的要点。您可以在此处以技术形式阅读有关 python classes
的更多信息:
或者,作为体面的解释者的一个例子,但到目前为止,这并不是唯一一个你应该 google 很多 :) 的关于这些东西的优秀的、易于理解的讨论,这里:
我正在绞尽脑汁思考如何根据要解压到的变量数量从 class 中有条件地解压变量,例如根据我在赋值左侧设置的数字,我得到了一组不同的变量解压。
例如,让我们考虑一个具有 x、y、z 以及纬度和经度位置的 class:
class LatLonOrXYZ:
def __init__(self, x, y, z, lat, lon):
self.x, self.y, self.z = x, y, z
self.lat, self.lon = lat, lon
def __iter__(self):
# not sure...
return iter([self.x, self.y, self.z, self.lat, self.lon])
现在我想实现如下目标:
pos = LatLonOrXYZ(x=0, y=1, z=2, lat=3, lon=4)
x, y, z = *pos # 0, 1, 2
lat, lon = *pos # 3, 4
是否有任何深奥的 python 魔法可以完成这类事情,还是我最好只写几个感觉如此不必要的方法?
一如既往,我们将不胜感激任何帮助、见解或建议:-)
这是完全可行的,但在您的示例中可能不是可迭代对象的最佳应用。
基本上,从您的可迭代对象中创建一个 list
,如 list([*pos])
,然后根据需要将其切片,例如 list([*pos])[0:3]
。
这是您的示例代码,它正在运行:
class LatLonOrXYZ:
def __init__(self, x, y, z, lat, lon):
self.x, self.y, self.z = x, y, z
self.lat, self.lon = lat, lon
def __iter__(self):
# not sure...
return iter([self.x, self.y, self.z, self.lat, self.lon])
pos = LatLonOrXYZ(x=0, y=1, z=2, lat=3, lon=4)
x, y, z = list([*pos])[0:3]
lat, lon = list([*pos])[3:5]
print(x, y, z)
print(lat, lon)
输出:
0 1 2
3 4
作为旁注,在您的示例代码中,您正在调用实际的 class 对象而不是 pos
实例。了解其中的区别很重要。
而不是:
pos = LatLonOrXYZ(x=0, y=1, z=2, lat=3, lon=4)
x, y, z = *LatLonOrXYZ # 0, 1, 2
lat, lon = *LatLonOrXYZ # 3, 4
您想做的是:
pos = LatLonOrXYZ(x=0, y=1, z=2, lat=3, lon=4)
x, y, z = *pos # 0, 1, 2
lat, lon = *pos # 3, 4
第一行创建一个基于 class 定义的对象,它是一个 instance
,或者使用您将要使用的 class
的结构和行为的对象作为代码中的一个位置。
考虑以下几点:
pos_1 = LatLonOrXYZ(x=0, y=1, z=2, lat=3, lon=4)
pos_2 = LatLonOrXYZ(x=4, y=3, z=2, lat=1, lon=0)
这是两个不同的对象,具有各自的特点,都按照 LatLonOrXYZ
class
的布局进行构造。基于相同蓝图的不同建筑物。
这是一个非常基本的描述,旨在指出事情的要点。您可以在此处以技术形式阅读有关 python classes
的更多信息:
或者,作为体面的解释者的一个例子,但到目前为止,这并不是唯一一个你应该 google 很多 :) 的关于这些东西的优秀的、易于理解的讨论,这里: