Как распаковать разные значения в зависимости от количества переменных, в которые нужно распаковать - PullRequest
0 голосов
/ 06 марта 2019

Я ломаю голову над тем, как условно распаковать переменные из класса в зависимости от количества переменных, в которые вы распаковываете, например. Я получаю другой набор переменных, распакованный в зависимости от числа, которое я установил в левой части задания.

Например, давайте рассмотрим класс с позициями 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

Есть ли какая-нибудь глубокая магия питона, которая могла бы выполнять подобные вещи, или мне лучше написать пару методов, которые кажутся такими ненужными?

Как всегда, любая помощь, понимание или совет будут очень полезны: -)

1 Ответ

1 голос
/ 06 марта 2019

Это вполне выполнимо, но, возможно, в вашем примере это не лучшее приложение итерируемого.

По сути, создайте 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 Учебное пособие по классам

Или, как пример достойных объяснений, нодалеко не единственное отличное, доступное обсуждение, касающееся этого материала, для которого вы должны гуглить лоты :), здесь:

ООП в Python - в Real Python

...