[Python-ideas] Combining test and assignment

Jim Jewett jimjjewett at gmail.com
Mon Jan 23 02:44:38 CET 2012


On Sat, Jan 21, 2012 at 11:05 PM, Eike Hein <sho at eikehein.com> wrote:
> On 1/22/2012 4:48 AM, Nick Coghlan wrote:
>> Simple embedded assignment, though, only works when the
>> predicate is just "bool" - as soon as the condition differs from the
>> value you want to access, you need to revert to the existing idiom
>> *anyway*.

> Actually, just to be clear, in the use case I had in mind
> spam() is returning a numeric value. That satisfies a truth
> test and is still useful in other ways (but I assume you
> are actually on the same page, hence the quotation marks
> around bool).

Perhaps.  Does bool(spam()) produce the right answer?  Or did you need
to work with 0, or ignore -1?

> Another, possibly better way is to modify locals(), i.e.:

Well, not locals directly, but the following was inspired by the
quantification thread.

You still need to declare the Var before the test expression, but the
declaration can be just a placeholder.

    x=Var()
    ...
    if Var(expr):

-jJ
-------------- next part --------------
class Var:
    """Var proxies another value; it allows assignment expressions

    Written by JimJJewett, inspired by Paul Moore's
    http://mail.python.org/pipermail/python-ideas/2012-January/013417.html
    
    >>> x=Var()
    >>> if x:
    ...     print("True", x)
    ... else:
    ...     print("False", x)
    False Var(None)
    
    >>> if x(5):
    ...     print("True", x.value)
    ... else:
    ...     print("False", x.value)
    True 5
    
    >>> if x({}):
    ...     print("True", x.value)
    ... else:
    ...     print("False", x.value)
    False {}
    
    """
    def __init__(self, value=None): self(value)
    def __call__(self, value): self.value=value; return self
    def __bool__(self): return bool(self.value)
    def __repr__(self): return "Var(%r)" % (self.value,)
    
def _test():
    import doctest
    doctest.testmod()

if __name__ == "__main__":
    _test()



More information about the Python-ideas mailing list