TypeError:__repr__返回了非字符串(类型Map)

时间:2018-11-09 15:01:41

标签: python python-3.x jupyter-notebook ipython

如何为地图类正确定义__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 :(得分:2)

__repr__方法必须返回一个字符串。来自the docs(我有些强调):

  

object.__repr__(self)

     

由repr()内置函数调用以计算对象的“正式”字符串表示形式。如果可能的话,这应该看起来像一个有效的Python表达式,可以用来重新创建具有相同值的对象(在适当的环境下)。如果这不可能,则应返回格式为<...一些有用的说明...>的字符串。 返回值必须是一个字符串对象。如果某个类定义了__repr__()而不是__str__(),那么当需要该类实例的“非正式”字符串表示形式时,也将使用__repr__()

编辑:正如@khelwood建议的那样,您可以使用return repr(self.map)方法__repr__