Dynamic QuotersΒΆ
XMLQuoter
and HTMLQuoter
show that it’s straightforward to define
Quoters
that don’t just concatenate text, but that examine it and
provide dynamic rewriting on the fly.
LambdaQuoter
is a further generalization of this idea. It allows generic
formatting to be done by a user-provided function. For example, in finance,
one often wants to present numbers with a special formatting:
from quoter import *
f = lambda v: ('(', abs(v), ')') if v < 0 else ('', v, '')
financial = LambdaQuoter(f)
print financial(-3) # (3)
print financial(45) # 45
password = LambdaQuoter(lambda v: ('', 'x' * len(v), ''))
print password('secret!') # xxxxxxx
wf = lambda v: ('**', v, '**') if v < 0 else ('', v, '')
warning = lambdaq._define("warning", wf)
print warning(12) # 12
print warning(-99) # **-99**
The trick is instantiating LambdaQuoter
with a callable (e.g. lambda
expression or even a full function) that accepts one value and returns a
tuple of three values: the quote prefix, the value (possibly rewritten), and
the suffix. The rewriting mechanism can be entirely general, doing truncation,
column padding, content obscuring, hashing, or...just anything.
LambdaQuoter
named instances are accessed through the lambdaq
front-end (because lambda
is a reserved word). Given the code above,
lambdaq.warning
is active, for example.
LambdaQuoter
shows how general a formatting function can be made into a
Quoter
. That has the virtue of providing a consistent mechanism for
tactical output transformation with built-in margin and padding support.
It’s also able to encapsulate complex quoting / representation decisions
that would otherwise muck up “business logic,” making representation code
much more unit-testable. But, one might argue that such full transformations
are “a bridge too far” for a quoting module. So use this dynamic component,
or not, as you see fit.