提交 968de8cd authored 作者: Francesco Visin's avatar Francesco Visin

Avoid __repr__ recursion

上级 a763418b
......@@ -764,7 +764,7 @@ def debugprint(r, prefix='', depth=-1, done=None, print_type=False,
outer_id_str = get_id_str(outer_r.owner)
else:
outer_id_str = get_id_str(outer_r)
print('%s%s %s%s -> %s' % (prefix, r.__str_name__(), id_str, type_str,
print('%s%s %s%s -> %s' % (prefix, r, id_str, type_str,
outer_id_str), file=file)
else:
# this is an input variable
......@@ -772,7 +772,7 @@ def debugprint(r, prefix='', depth=-1, done=None, print_type=False,
if smap:
data = " " + str(smap.get(r, ''))
id_str = get_id_str(r)
print('%s%s %s%s%s' % (prefix, r.__str_name__(), id_str,
print('%s%s %s%s%s' % (prefix, r, id_str,
type_str, data),
file=file)
......
......@@ -646,8 +646,10 @@ AddConfigVar(
AddConfigVar(
'print_test_value',
("If 'True', Theano will override the '__str__' method of its "
"variables to also print the tag.test_value when this is available."),
("If 'True', the __eval__ of a Theano variable will return its test_value "
"when this is available. This has the practical conseguence that, e.g., "
"in debugging `my_var` will print the same as `my_var.tag.test_value` "
"when a test value is defined."),
BoolParam(False),
in_c_key=False)
......
......@@ -391,47 +391,44 @@ class Variable(Node):
self.name = name
self.auto_name = 'auto_' + str(next(self.__count__))
def __str__(self, firstPass=True):
"""Return a str representation of the Variable
def __str__(self):
"""Return a str representation of the Variable.
Return a printable name or description of the Variable. If
config.print_test_value is True it will also print the test_value if
any.
"""
to_print = []
if config.print_test_value and firstPass:
try:
to_print.append(self.__str_test_value__())
except AttributeError:
return self.__str__(False)
if self.name is not None:
return '\n'.join([self.name] + to_print)
return self.name
if self.owner is not None:
op = self.owner.op
if self.index == op.default_output:
return '\n'.join(
[str(self.owner.op) + ".out"] + to_print)
return str(self.owner.op) + ".out"
else:
return '\n'.join(
[str(self.owner.op) + "." + str(self.index)] + to_print)
return str(self.owner.op) + "." + str(self.index)
else:
return '\n'.join(["<%s>" % str(self.type)] + to_print)
return "<%s>" % str(self.type)
def __str_test_value__(self):
"""Return a repr of the test value
def __repr_test_value__(self):
"""Return a repr of the test value.
Return a printable representation of the test value. It can be
overridden by classes with non printable test_value to provide a
suitable representation of the test_value.
"""
try:
return repr(theano.gof.op.get_test_value(self))
except:
raise
def __repr__(self):
return str(self)
def __repr__(self, firstPass=True):
"""Return a repr of the Variable.
Return a printable name or description of the Variable. If
config.print_test_value is True it will also print the test_value if
any.
"""
to_print = [str(self)]
if config.print_test_value and firstPass:
try:
to_print.append(self.__repr_test_value__())
except AttributeError:
pass
return '\n'.join(to_print)
def clone(self):
"""
......
......@@ -45,11 +45,8 @@ class CudaNdarrayVariable(_operators, Variable):
pass
# override default
def __str_test_value__(self):
try:
def __repr_test_value__(self):
return repr(numpy.array(theano.gof.op.get_test_value(self)))
except:
raise
CudaNdarrayType.Variable = CudaNdarrayVariable
......
......@@ -420,6 +420,9 @@ class _operators(_tensor_py_operators):
class GpuArrayVariable(_operators, Variable):
# override the default
def __repr_test_value__(self):
return repr(numpy.array(theano.gof.op.get_test_value(self)))
pass
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论