@@ -67,16 +67,19 @@ proc defaultEq(o1, o2: PyObject): PyObject {. cdecl .} =
6767 if rawEq (o1, o2): pyTrueObj
6868 else : pyFalseObj
6969
70- proc reprDefault (self: PyObject ): PyObject {. cdecl .} =
71- newPyString (fmt" <{ self.pyType.name} at { self.idStr} > " )
70+
71+ template asAttrNameOrRetE * (name: PyObject ): PyStrObject =
72+ bind ofPyStrObject, typeName, newTypeError, newPyStr, PyStrObject
73+ bind formatValue, fmt
74+ if not ofPyStrObject (name):
75+ let n{.inject .} = typeName (name)
76+ return newTypeError newPyStr (
77+ fmt" attribute name must be string, not '{ n:.200s } ' " ,)
78+ PyStrObject name
7279
7380# generic getattr
74- proc getAttr (self: PyObject , nameObj: PyObject ): PyObject {. cdecl .} =
75- if not nameObj.ofPyStrObject:
76- let typeStr = nameObj.pyType.name
77- let msg = fmt" attribute name must be string, not { typeStr} "
78- return newTypeError (newPyStr msg)
79- let name = PyStrObject (nameObj)
81+ proc getAttr (self: PyObject , nameObj: PyObject ): PyObject {. cdecl .} =
82+ let name = nameObj.asAttrNameOrRetE
8083 let typeDict = self.getTypeDict
8184 if typeDict.isNil:
8285 unreachable (" for type object dict must not be nil" )
@@ -99,11 +102,7 @@ proc getAttr(self: PyObject, nameObj: PyObject): PyObject {. cdecl .} =
99102
100103# generic getattr
101104proc setAttr (self: PyObject , nameObj: PyObject , value: PyObject ): PyObject {. cdecl .} =
102- if not nameObj.ofPyStrObject:
103- let typeStr = nameObj.pyType.name
104- let msg = fmt" attribute name must be string, not { typeStr} "
105- return newTypeError (newPyStr msg)
106- let name = PyStrObject (nameObj)
105+ let name = nameObj.asAttrNameOrRetE
107106 let typeDict = self.getTypeDict
108107 if typeDict.isNil:
109108 unreachable (" for type object dict must not be nil" )
0 commit comments