sorry, it’s a bit more difficult. this works:
https://gist.github.com/flying-sheep/86dfcc1bdd71a33fa3483b83e254084c

Philipp A. <flying-sh...@web.de> schrieb am Do., 7. Sep. 2017 um 21:18 Uhr:

> Sadly it’s hard to create a context manager that skips its body like this:
>
> with unpack(computation()) as result:
>     do_something_with_result(result)
>
> You can do it with some hackery like described here:
> https://stackoverflow.com/a/12594789/247482
>
> class unpack:
>     def __init__(self, pred):
>         self.pred = pred
>
>     def __enter__(self):
>         if self.pred:
>             return self.pred
>         # else skip the with block’s body
>         sys.settrace(lambda *args, **kw: None)
>         frame = inspect.currentframe(1)
>         frame.f_trace = self.trace
>
>     def trace(self, frame, event, arg):
>         raise
>
>     def __exit__(self, type, value, traceback):
>         return True  # suppress the exception
>
> Steven D'Aprano <st...@pearwood.info> schrieb am Do., 7. Sep. 2017 um
> 18:26 Uhr:
>
>> On Thu, Sep 07, 2017 at 04:36:40PM +0200, Jason H wrote:
>>
>> > I also often wonder why we are left doing an assignment and test. You
>> have two options:
>> > 1. assign to a variable then test and use
>> > 2. repeat the function call
>>
>> Personally, I don't see what's wrong with the "assign then test" idiom.
>>
>> x = something()
>> if x:
>>     do_stuff()
>>
>>
>> > I would offer that 'with' [sh|c]ould be used:
>> > with test() as x:
>> >    handle_truthy(x)
>> > else:
>> >    handle_falsey() # do we provide x here too? Because None vs False?
>>
>>
>> This would cause confusing errors and mysterious behaviour, depending on
>> whether the test() object was a context manager or not. Which should
>> take priority? If you see:
>>
>> with spam() as x:
>>    do_stuff
>>
>> is that a context manager with block (like "with open(...) as f") or
>> your boolean if test in disguise?
>>
>> Having "with" sometimes be a disguised "if" and sometimes a regular
>> "with" will make it really, really hard to reason about code.
>>
>>
>> --
>> Steve
>> _______________________________________________
>> Python-ideas mailing list
>> Python-ideas@python.org
>> https://mail.python.org/mailman/listinfo/python-ideas
>> Code of Conduct: http://python.org/psf/codeofconduct/
>>
>
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to