Sorry, i was confused. I would say that this mostly works as expected,
though the difference between
x = 42
class C:
x = x # Works
and
def f2(a):
class D:
a = a # Does not work <<<<<
return D
is still surprising to me.
Otherwise, probably the solution with
def f(a):
_a = a
class D:
a = _a
return D
is good enough, if Python does not allow to refer "simultaneously" to
variables from different scopes if they have the same name.
Alexey.
On Tue, 8 May, 2018 at 12:21 AM, Alexey Muranov
<alexey.mura...@gmail.com> wrote:
To be more exact, i do see a few workarounds, for example:
def f4(a):
b = a
class D:
a = b # Works
return D
But this is not what i was hoping for.
Alexey.
On Tue, 8 May, 2018 at 12:02 AM, Alexey Muranov
<alexey.mura...@gmail.com> wrote:
I have discovered the following bug or problem: it looks like i am
forced to choose different names for class attributes and function
arguments, and i see no workaround. Am i missing some special
syntax feature ?
Alexey.
---
x = 42
class C1:
y = x # Works
class C2:
x = x # Works
# ---
def f1(a):
class D:
b = a # Works
return D
def f2(a):
class D:
a = a # Does not work <<<<<
return D
def f3(a):
class D:
nonlocal a
a = a # Does not work either <<<<<
return D
# ---
def g1(a):
def h():
b = a # Works
return b
return h
def g2(a):
def h():
a = a # Does not work (as expected)
return a
return h
def g3(a):
def h():
nonlocal a
a = a # Works
return a
return h
# ---
if __name__ == "__main__":
assert C1.y == 42
assert C2.x == 42
assert f1(13).b == 13
try:
f2(13) # NameError
except NameError:
pass
except Exception as e:
raise Exception( 'Unexpected exception raised: '
'{}'.format(type(e).__name__) )
else:
raise Exception('No exception')
try:
f3(13).a # AttributeError
except AttributeError:
pass
except Exception as e:
raise Exception( 'Unexpected exception raised: '
'{}'.format(type(e).__name__) )
else:
raise Exception('No exception')
assert g1(13)() == 13
try:
g2(13)() # UnboundLocalError
except UnboundLocalError:
pass
except Exception as e:
raise Exception( 'Unexpected exception raised: '
'{}'.format(type(e).__name__) )
else:
raise Exception('No exception')
assert g3(13)() == 13
--
https://mail.python.org/mailman/listinfo/python-list