создание экземпляров классов из текстового файла в Python - PullRequest
0 голосов
/ 28 ноября 2011

У меня есть класс полиномов:

class Polynomial:
    def __init__(self, *termpairs):
        self.termdict = dict(termpairs)

Чтобы добавить экземпляр в этот класс, введите следующее:

P = Polynomial((3,2), (4,5), (9,8))

Теперь я пытаюсь создать функцию, котораясчитывает информацию из текстового файла и из этого текстового файла создает экземпляр класса Polynomial.Информация хранится в текстовом файле следующим образом:

4 6
2 3
9 8
3 5
0 42

Пока что функция выглядит так:

def read_file(polyfilename):
    polyfilename = open("polyfilename.txt", "r")
    poly1 = polyfilename.read()
    polyfilename.close()
    poly1 = [line.split() for line in poly1.split("\n")]
    poly1 = [[int(y) for y in x] for x in poly1]
    for item in poly1:
        return Polynomial(item)

Она создает только полиномиальный экземпляр для первой пары втекстовый файл, как я могу сделать полиномиальный экземпляр для всех пар в текстовом файле?

РЕДАКТИРОВАТЬ: Теперь у меня есть это как моя функция:

def read_file(polyfilename):
    polyfilename = open("polyfilename.txt", "r")
    poly = polyfilename.read()
    polyfilename.close()
    poly = [line.split() for line in poly.split("\n")]
    poly = [[int(y) for y in x] for x in poly]
    return Polynomial(poly[0], poly[1], poly[2], poly[3], poly[4])

Это дает мне ответЯ ищу, однако, длина этих текстовых файлов может варьироваться, поэтому ввод poly [1], poly [2] не сработает.Есть ли способ, которым я могу просмотреть каждый индекс независимо от его длины?

Ответы [ 3 ]

1 голос
/ 28 ноября 2011

return всегда выходит из функции сразу после вызова и может вернуть только один элемент.Поэтому, если вы хотите, чтобы несколько элементов (в некотором смысле) были возвращены, вы должны упаковать их в список, а затем вернуть его.

Вместо цикла for:

polys = []
for item in poly1:
    polys.append(Polynomial(item))
return polys

Youконечно, придется иметь дело с этим новым результатом в виде списка.

1 голос
/ 28 ноября 2011

Все, что вам нужно, это

return Polynomial(*poly)

вместо

return Polynomial(poly[0], poly[1], poly[2], poly[3], poly[4])

Документы здесь ... читать абзац, начинающийся с "" "Если синтаксис *выражение появляется в вызове функции "" "

Бонус: Ваша функция не использует свой аргумент, повторно использует имя poly как сумасшедший и не идиоматична, поэтому я переписал все это:

def read_file(polyfilename):
    with open(polyfilename) as f:
        return Polynomial(*[[int(x) for x in line.split()] for line in f])

HTH

0 голосов
/ 28 ноября 2011

На первый взгляд кажется, что он возвращается после создания первого, поэтому вы получаете только один назад. Попробуйте заменить оператор return на yield тогда:

for p in read_file('somefile'):
  # p is a polynomial object, do what you will with it

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

    def read_file(polyfilename):
        polyfilename = open(polyfilename, "r")
        poly1 = polyfilename.read()
        polyfilename.close()
        poly1 = [line.split() for line in poly1.split("\n")]
        poly1 = [[int(y) for y in x] for x in poly1]
        for item in poly1:
            yield Polynomial(item)

    for p in read_file('sample.txt'):
        print p

Производит

<__main__.Polynomial instance at 0x39f3f0>
<__main__.Polynomial instance at 0x39f418>
<__main__.Polynomial instance at 0x39f3f0>
<__main__.Polynomial instance at 0x39f418>
<__main__.Polynomial instance at 0x39f3f0>
...