Skip to content

Pdb NameError in generator param and list comprehension #80052

Description

@jayanth
mannequin
BPO 35871
Nosy @xdegaye, @tirkarthi

Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

Show more details

GitHub fields:

assignee = None
closed_at = None
created_at = <Date 2019-02-01.00:25:49.653>
labels = ['interpreter-core', '3.7']
title = 'Pdb NameError in generator param and list comprehension'
updated_at = <Date 2019-02-01.05:21:32.902>
user = 'https://bugs.python.org/jayanth'

bugs.python.org fields:

activity = <Date 2019-02-01.05:21:32.902>
actor = 'jayanth'
assignee = 'none'
closed = False
closed_date = None
closer = None
components = ['Interpreter Core']
creation = <Date 2019-02-01.00:25:49.653>
creator = 'jayanth'
dependencies = []
files = []
hgrepos = []
issue_num = 35871
keywords = []
message_count = 3.0
messages = ['334639', '334646', '334647']
nosy_count = 3.0
nosy_names = ['xdegaye', 'jayanth', 'xtreak']
pr_nums = []
priority = 'normal'
resolution = None
stage = None
status = 'open'
superseder = None
type = None
url = 'https://bugs.python.org/issue35871'
versions = ['Python 3.7']

Activity

  1. jayanth commented on Feb 1, 2019

    jayanthmannequin
    MannequinAuthor

    I get a NameError for a variable in the generator param of a function or in a list comprehension. See example below. The variable is available to the program, but not to the interactive Pdb shell.

    # Test file:

    def main(nn=10):
        xx = list(range(nn))
        breakpoint()
        for ii in range(nn):
            num = sum(xx[jj] for jj in range(nn))
        print(f'xx={xx}')
    
    if __name__ == '__main__':
        main()

    $ python3
    Python 3.7.2 (default, Jan 13 2019, 12:50:15)
    [Clang 10.0.0 (clang-1000.11.45.5)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.

    >>

    $ python3 /tmp/test.py
    > /tmp/test.py(5)main()
    -> for ii in range(nn):
    (Pdb) n
    > /tmp/test.py(6)main()
    -> num = sum(xx[jj] for jj in range(nn))
    (Pdb) sum(xx[jj] for jj in range(nn))
    *** NameError: name 'xx' is not defined
    (Pdb) [xx[jj] for jj in range(nn)]
    *** NameError: name 'xx' is not defined
    (Pdb) c
    xx=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    FWIW python3 is a homebrew installation. I had the same issue with 3.7.0 as well (also homebrew):
    Python 3.7.0 (default, Sep 18 2018, 18:47:22)
    [Clang 9.1.0 (clang-902.0.39.2)] on darwin

  2. tirkarthi commented on Feb 1, 2019

    @tirkarthi
    Member

    Thanks for the report. This seems related to bpo-21161 and bpo-26072 that contain explanation about scope where exec is called with the code and patches that fix this issue. As a possible workaround in the issues you can use "interact" command to get to a REPL where you can evaluate and exit back to pdb.

  3. jayanth commented on Feb 1, 2019

    jayanthmannequin
    MannequinAuthor

    Thanks for the "interact" tip.

    FWIW, I see this issue in 2.7.10 as well. Although the list comprehension works.

    $ python
    Python 2.7.10 (default, Oct  6 2017, 22:29:07)
    [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> ^D
    $ python /tmp/test2.py
    > /tmp/test2.py(5)main()
    -> for ii in range(nn):
    (Pdb) n
    > /tmp/test2.py(6)main()
    -> num = sum(xx[jj] for jj in range(nn))
    (Pdb) sum(xx[jj] for jj in range(nn))
    *** NameError: global name 'xx' is not defined
    (Pdb) [xx[jj] for jj in range(nn)]
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    (Pdb) c
    ('xx', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

    # test2.py

    def main(nn=10):
        xx = list(range(nn))
        import pdb; pdb.set_trace()
        for ii in range(nn):
            num = sum(xx[jj] for jj in range(nn))
        print('xx', xx)
    
    if __name__ == '__main__':
        main()
  4. transferred this issue fromon Apr 10, 2022
  5. gaogaotiantian commented on May 6, 2024

    @gaogaotiantian
    Member

    Fix by PEP 709 + #111094

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    3.7 (EOL)end of lifeinterpreter-core(Objects, Python, Grammar, and Parser dirs)

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions