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

Reply via email to