Автор Тема: python3 typeerror 'map' object is not subscriptable  (Прочитано 2760 раз)

Оффлайн LanuHum

  • Житель
python3 typeerror 'map' object is not subscriptable
« : 26 Октябрь 2014, 20:35:06 »
Задам ещё и здесь этот вопрос.
Как это написать на третьем питоне
Код
    def __init__(self, in_stream):
        for line in in_stream:
            if not line.isspace():
                v0, v1, v2, r, e = SEARCH(line).groups()
                self.vertexs = map(Vector3f, [v0, v1, v2])
                self.edge0 = Vector3f(v1) - Vector3f(v0)
                self.edge3 = Vector3f(v2) - Vector3f(v0)
                self.reflectivity = Vector3f(r).clamped(ZERO, ONE)
                self.emitivity = Vector3f(e).clamped(ZERO, MAX)
                edge1 = Vector3f(v2) - Vector3f(v1)
                self.tangent = self.edge0.unitize()
                self.normal = self.tangent.cross(edge1).unitize()
                pa2 = self.edge0.cross(edge1)
                self.area = sqrt(pa2.dot(pa2)) * 0.5
                return
        raise StopIteration

    def get_bound(self):
        bound = list(self.vertexs[2]) + list(self.vertexs[2])
        print (bound)
        for i in range(3):
            v = self.vertexs[i]
            for j in range(6):
                d, m = -1 if (j >= 3) else 1, j % 3
                a = v[m] - (d * TOLERANCE)
                if ((a - bound[j]) * d) < 0.0:
                    bound[j] = a
        return bound
Как этот бесов bound создать не импользуя map?

bdancer

  • Гость
Re: python3 typeerror 'map' object is not subscriptable
« Ответ #1 : 28 Октябрь 2014, 17:06:30 »
В Python 3 map() возвращает итератор, а не лист.
Замени:
Код
for i in range(3):
            v = self.vertexs[i]
на:
Код
for v in self.vertexs:

Оффлайн LanuHum

  • Житель
Re: python3 typeerror 'map' object is not subscriptable
« Ответ #2 : 28 Октябрь 2014, 19:54:46 »
В Python 3 map() возвращает итератор, а не лист.
Замени:
Код
for i in range(3):
            v = self.vertexs[i]
на:
Код
for v in self.vertexs:

А как быть с bound?
Код
bound = list(self.vertexs[2]) + list(self.vertexs[2])
Мне посоветовали сделать так:
Код
self.vertexs = list(map(Vector3f, [v0, v1, v2]))
Это, работает, вроде, но вылазит другая ошибка, связанная с третьим питоном в записи файла PPM.
TypeError: 'str' does not support the buffer interface
Ну, это я попробую обойти, создавая изображение другого расширения, которое третий питон создаст без проблем, используя модуль pillow.

bdancer

  • Гость
Re: python3 typeerror 'map' object is not subscriptable
« Ответ #3 : 29 Октябрь 2014, 13:58:57 »
Код
А как быть с bound?
Проглядел, сорри. Тогда делай так как советуют ( list(map()) ).

Код
TypeError: 'str' does not support the buffer interface
Это при записи в файл? Скорее всего требуется что-то типа your_str_object.encode('some-codepage') или bytes(your_str_object, 'some-codepage')
« Последнее редактирование: 29 Октябрь 2014, 17:01:45 от bdancer »

Оффлайн LanuHum

  • Житель
Re: python3 typeerror 'map' object is not subscriptable
« Ответ #4 : 29 Октябрь 2014, 19:54:22 »
Цитировать
Это при записи в файл? Скорее всего требуется что-то типа your_str_object.encode('some-codepage') или bytes(your_str_object, 'some-codepage')
Благодарю, но, для меня это тёмный лес, пока. Я заменил код записи ppm на запись png с помощью pillow. Теперь код работает на третьем питоне, и, можно изучать принципиальное устройство рейтрейсера. :)

 


Яметрика

* По форуму

* Рекламный блок

* Последние вложения

1 (1).png
Скачано: 68
Автор: LEXA ANЭGROWND
blender.png
Скачано: 78
Автор: ipv2007
4.png
Скачано: 100
Автор: hiroyukiss
2.png
Скачано: 122
Автор: hiroyukiss

Скачано: 112
Автор: Dilifa12