On Mon, Oct 14, 2019 at 9:39 AM Steven D'Aprano <[email protected]> wrote:
>
> On Sun, Oct 13, 2019 at 03:59:19PM +0200, Anders Hovmöller wrote:
>
> > A thing to consider here is that the with block in python doesn't introduce
> > a scope so after:
> >
> > with foo() as bar:
> > a = 2
> > b = 3
> >
> > now bar, a and b are all available in the scope.
>
> That's not a problem. We could introduce a rule that when the with block
> is part of an assignment, the with block runs in a seperate scope.
>
> A bigger problem is that this would be the first statement which
> returns a value (as opposed to having an effect via side-effects, like
> the class and def statements), and it would only be usable in
> assignments:
>
> spam = with eggs() as cheese:
> ...
>
> but not:
>
> items = [x, y, with eggs() as cheese: ... , z]
>
>
Scope... return value... this sounds familiar. What if this were
actually a function? You'd have to implement build_choices
appropriately for this to work, but you'd need to do that for the
context manager anyway.
@build_choices('Restaurant')
def restaurant_choices(cb):
# Get of nonexistent attr auto-generates matching entry.
cb.BURGER_KING
cb.FIVE_GUYS
# Returned value is a ChoiceItem that implements __mod__ to return a
# new ChoiceItem instance w/ substituted label.
cb.MCDONALDS %= "McDonald's"
print(restaurant_choices)
# RestaurantChoices(
# (
# ('BURGER_KING', 'Burger King'),
# ('FIVE_GUYS', 'Five Guys'),
# ('MCDONALDS', "McDonald's")))
print(RestaurantChoices.BURGER_KING)
To make this work, your build_choices would need to have something like this:
class build_choices:
def __call__(self, builder):
builder(self)
return self
Does that look clean enough?
ChrisA
_______________________________________________
Python-ideas mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at
https://mail.python.org/archives/list/[email protected]/message/5SHTO7LOKSAIJYBN2P574KKTBGPW3YPV/
Code of Conduct: http://python.org/psf/codeofconduct/