Python: перебирать атрибуты и изменять их на месте - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть проблема, и я ищу питонский способ ее решения. Я хочу сделать что-то подобное:

def ConvertData(self):
    for dataSet in [self.trainData, self.testData]:
        convertedDataSet = ... do_something(dataSet) ...
        dataSet = convertedDataSet

Итак, я хочу преобразовать все мои атрибуты класса одинаково, не копируя этот код для каждого атрибута. Но то, как я это сделал, не работает. В приведенном выше цикле for в конце dataSet преобразуется правильно. Но, естественно, это не будет присвоено self.trainData.

Как правильно программировать

convertedDataSet = ... do_something(self.trainData) ...
self.trainData = convertedDataSet

convertedDataSet = ... do_something(self.testData) ...
self.testData = convertedDataSet

Большое спасибо! :)

Редактировать: я нашел решение с getattr и setattr:

def ConvertData(self):
    for attr in ["trainData", "testData"]:
        convertedDataSet = ... do_something(getattr(self, attr)) ...
        setattr(self, attr, convertedDataSet)

Но мне все еще не нравится это. Это лучший способ сделать это или есть лучшие решения?

1 Ответ

0 голосов
/ 17 ноября 2018

Ваш вопрос не имеет ничего общего с attr, имеет отношение только к list.Например:

numbers = [1, 2, 3]
for number in numbers:
    number = 2 * number

Очевидно, что после цикла numbers по-прежнему [1, 2, 3].

Чтобы изменить элемент списка, вам нужно использовать enumerate:

def ConvertData(self):
    dataSets = [self.trainData, self.testData]
    for i, dataSet in enumerate(dataSets):
        convertedDataSet = ... do_something(dataSet) ...
        dataSets[i] = convertedDataSet
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...