Problem/bug with class definition inside function definition

Alexey Muranov alexey.muranov at gmail.com
Mon May 7 18:02:34 EDT 2018


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


More information about the Python-list mailing list

AltStyle によって変換されたページ (->オリジナル) /