Помогите очистить немного кода Python - PullRequest
2 голосов
/ 25 марта 2011

Ниже у меня есть немного кода, который присваивает значения на основе значений в кортеже tup . Теперь этот кусок кода слишком повторяется для моих вкусов, и я хотел бы иметь возможность использовать цикл с ним.

Отрывок:

    self.Levels = tup[0]
    self.MaxX   = tup[1]
    self.MaxY   = tup[2]
    self.BW     = tup[3]

Я бы хотел сделать что-то вроде следующего; однако, это, очевидно, синтаксически не будет работать в Python.

    nametup = (self.Levels, self.MaxX, self.MaxY, self.BW)

    for i in range(len(tup)):
        nametup[i] = tup[i]

EDIT:

Мне пришлось изменить мой фрагмент на:

    if tup[0] != None:
        self.Levels = tup[0]

    if tup[1] != None:
        self.MaxX   = tup[1]

    if tup[2] != None:
        self.MaxY   = tup[2]

    if tup[3] != None:
        self.BW     = tup[3]

Утверждение if из того, что я понимаю, бросает рывок в идею распаковки кортежей. Какие-либо предложения?

Ответы [ 3 ]

5 голосов
/ 25 марта 2011

Попробуйте это:

self.Levels, self.MaxX, self.MaxY, self.BW = tup

Это называется распаковкой кортежа.

2 голосов
/ 25 марта 2011

На основе пересмотренного фрагмента:

attrs = ('Levels', 'MaxX', 'MaxY', 'BW')
assert len(tup) == len(attrs)
for attr, val in zip(attrs, tup):
    if val is not None: # don't use !=
        setattr(self, attr, val)
0 голосов
/ 25 марта 2011

Это вид «длинного пути», но для сравнения:

attrs = ('Levels', 'MaxX', 'MaxY', 'BW')
for attr,val in zip(attrs,tup):
    setattr(self, attr, val)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...