TypeError: __repr__ вернул не-строку (тип Map) - PullRequest
0 голосов
/ 09 ноября 2018

Как правильно определить __repr__ для моего класса карты?

class map(object):
    """Find data folders that could be imported and return as list"""
    def __init__(self,height=400,zoom=0):
        """Initialize the map"""
        if zoom == 0:
            z = get_map_zoom()
        else:
            z = zoom
        self.map = Map(center=get_map_center(), zoom=z)
        self.map.layout.height = f'{height}px'
    def __repr__(self):
        return self.map
    def add_layer(self,tableName:str,style_name='default',geomColumn:str = 'geom'):
        """Get GeoJSON data from database and add as layer to map"""
        data = db.execute(f'SELECT ST_AsGeojson(ST_Transform({geomColumn},4326)) from {tableName} order by random() limit 5000;')
        style = get_style(style_name)
        geo_json = GeoJSON(style=style,data={'type': "FeatureCollection", 'features': [json.loads(row[0]) for row in data]})
        self.map.add_layer(geo_json)

Из Jupyter я создаю карту так:

from modules import map
m = map.map()

m.add_layer('geo.service_area','service_area')
m.add_layer('rawgeo.ways',geomColumn='the_geom')

display(m)

Но ошибка TypeError: __repr__ returned non-string (type Map) возникает на display(m).

Я могу заставить его работать, если вместо этого использую display(m.map).

1 Ответ

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

Метод __repr__ должен возвращать строку. От документов (некоторые акценты мои):

object.__repr__(self)

Вызывается встроенной функцией repr () для вычисления «официального» строкового представления объекта. Если это вообще возможно, это должно выглядеть как допустимое выражение Python, которое можно использовать для воссоздания объекта с тем же значением (с учетом соответствующей среды). Если это невозможно, должна быть возвращена строка вида <... некоторое полезное описание ...>. Возвращаемое значение должно быть строковым объектом . Если класс определяет __repr__(), но не __str__(), тогда __repr__() также используется, когда требуется «неформальное» строковое представление экземпляров этого класса.

Редактировать : Как @khelwood предлагает, вы можете return repr(self.map) в методе __repr__.

...