1

I've coded something like

#!/usr/bin/env python3
'''
Illustration
'''


class C1:
    lst1 = "one", "two", "three"
    lst2 = "red", "green", "blue"
    dct1 = { "ten": 10, "eleven": 11, "twelve": 12 }
    lst3 = tuple(dct1.keys())
    lst4 = tuple(x for x in lst2)
    lst5 = tuple(x for x in lst1 if x not in lst2)


# vim:set ft=python ai et ts=4 sts=4 sw=4 cc=80:EOF #

then ran the code and got

Traceback (most recent call last):
  File "/home/jno/xxx.py", line 7, in <module>
    class C1:
  File "/home/jno/xxx.py", line 13, in C1
    lst5 = tuple(x for x in lst1 if x not in lst2)
  File "/home/jno/xxx.py", line 13, in <genexpr>
    lst5 = tuple(x for x in lst1 if x not in lst2)
NameError: name 'lst2' is not defined

So, I wonder, why the hell lst2 is visible in lst4 creation and not visible in lst5?

I mean, what's the difference in appearance in different clauses of the same symbol regarding that symbol visibility?

Or how do I have to reference it here?

PS. RESOLVED (Thanks to moderator for way better refs than were provided at the time of question creation!)

It will work in this notation:

class C1:
    lst1 = "one", "two", "three"
    lst2 = "red", "green", "blue"
    dct1 = { "ten": 10, "eleven": 11, "twelve": 12 }
    lst3 = tuple(dct1.keys())
    lst4 = tuple(x for x in lst2)
    # lst5 = tuple(x for x in lst1 if x not in lst2)
    lst5 = (lambda P1, P2: tuple(x for x in P1 if x not in P2))(lst1, lst2)  # move name resolution out of "function scope"

See https://stackoverflow.com/a/40849176/1278896 And https://docs.python.org/3/reference/executionmodel.html#resolution-of-names

jno
  • 997
  • 1
  • 10
  • 18

0 Answers0