如何根据要解压到的变量数量解压不同的值

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 的更多信息:

Python.org Classes Tutorial

或者,作为体面的解释者的一个例子,但到目前为止,这并不是唯一一个你应该 google 很多 :) 的关于这些东西的优秀的、易于理解的讨论,这里:

OOP in Python - at Real Python