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

问题描述 投票:0回答:1

我正在试着如何有条件地从类中解压缩变量,这取决于你要拆包的变量数量,例如:根据我在作业左侧设置的数字,我得到一组不同的变量。

例如,让我们考虑一个同时具有x,y,z和纬度和经度位置的类:

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 iterable-unpacking
1个回答
1
投票

这是完全可行的,但在您的示例中,可能不是可迭代的最佳应用程序。

基本上,从你的iterable中创建一个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

作为旁注,在您的示例代码中,您调用的是实际的类对象而不是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

第一行基于类定义创建一个对象,该类是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

或者,作为一个体面的解释器的一个例子,但到目前为止,不是唯一一个关于这个东西的优秀,可访问的讨论,你应该谷歌很多:),这里:

OOP in Python - at Real Python

© www.soinside.com 2019 - 2024. All rights reserved.