Lazy format strings¶
Lazy format strings
We recommend to use
sage.misc.lazy_string.lazy_string()instead, which is both faster and more flexible.
An instance of
LazyFormatbehaves like a usual format string, except that the evaluation of the
__repr__method of the formatted arguments it postponed until actual printing.
Under normal circumstances,
Lazyformatstrings behave as usual:
sage: from sage.misc.lazy_format import LazyFormat sage: LazyFormat("Got `%s`; expected a list")%3 Got `3`; expected a list sage: LazyFormat("Got `%s`; expected %s")%(3, 2/3) Got `3`; expected 2/3
To demonstrate the lazyness, let us build an object with a broken
sage: class IDontLikeBeingPrinted(object): ....: def __repr__(self): ....: raise ValueError("Don't ever try to print me !")
There is no error when binding a lazy format with the broken object:
sage: lf = LazyFormat("<%s>")%IDontLikeBeingPrinted()
The error only occurs upon printing:
sage: lf <repr(<sage.misc.lazy_format.LazyFormat at 0x...>) failed: ValueError: Don't ever try to print me !>
Common use case:
Most of the time,
__repr__methods are only called during user interaction, and therefore need not be fast; and indeed there are objects
xin Sage such
x.__repr__()is time consuming.
sage: QQ._tester().assertTrue(0 in QQ, ....: "%s doesn't contain 0"%QQ)
In the above
QQ.__repr__()has been called, and the result immediately discarded. To demonstrate this we replace
sage: QQ._tester().assertTrue(True, ....: "%s doesn't contain 0"%IDontLikeBeingPrinted()) Traceback (most recent call last): ... ValueError: Don't ever try to print me !
This behavior can induce major performance penalties when testing. Note that this issue does not impact the usual assert:
sage: assert True, "%s is wrong"%IDontLikeBeingPrinted()
We now check that
LazyFormatindeed solves the assertion problem:
sage: QQ._tester().assertTrue(True, ....: LazyFormat("%s is wrong")%IDontLikeBeingPrinted()) sage: QQ._tester().assertTrue(False, ....: LazyFormat("%s is wrong")%IDontLikeBeingPrinted()) Traceback (most recent call last): ... AssertionError: <unprintable AssertionError object>