Skip to content

Namespace Implementation

Dictionary Storage

1. Namespace is Dict

# Namespace = dictionary
x = 10
y = 20

print(locals())
# {'x': 10, 'y': 20, ...}

2. Access

# Direct access
namespace = locals()
print(namespace['x'])  # 10

# Equivalent to
print(x)  # 10

Local Namespace

1. Function Locals

def function():
    x = 10
    y = 20

    # View namespace
    print(locals())
    # {'x': 10, 'y': 20}

function()

2. Fast Locals

CPython optimization:

# Local variables stored in array
# locals() creates dict copy

def f():
    x = 10
    # x stored in fast locals (array)
    # Not in dict initially

Global Namespace

1. Module Dict

x = 10

# Module __dict__
print(globals()['x'])  # 10

# Same as
print(x)  # 10

2. Module Attributes

import sys

# Current module
this_module = sys.modules[__name__]

# Access via attribute
x = 10
print(this_module.x)  # 10

Built-in Namespace

1. Builtins Module

import builtins

# Access built-ins
print(builtins.len)
print(builtins.print)

# Check existence
print(hasattr(builtins, 'len'))  # True

Dynamic Access

1. vars()

x = 10
y = 20

# Get namespace dict
namespace = vars()
print(namespace['x'])  # 10

2. getattr()

import sys

# Get attribute dynamically
module = sys.modules[__name__]
value = getattr(module, 'x', None)

Frame Namespace

1. Frame Locals

import inspect

def function():
    x = 10

    frame = inspect.currentframe()
    print(frame.f_locals)
    # {'x': 10, 'frame': ...}

function()

2. Frame Globals

import inspect

def function():
    frame = inspect.currentframe()
    print('x' in frame.f_globals)

function()

Class Namespace

1. Class Dict

class MyClass:
    x = 10
    y = 20

# Class __dict__
print(MyClass.__dict__['x'])  # 10

2. Instance Dict

class MyClass:
    def __init__(self):
        self.x = 10

obj = MyClass()
print(obj.__dict__)  # {'x': 10}

Modification

1. Direct Modification

# Add to namespace
globals()['new_var'] = 42
print(new_var)  # 42

2. Warning

# locals() modification doesn't work!
def f():
    locals()['x'] = 10
    # print(x)  # NameError

# Use normal assignment
def g():
    x = 10  # Correct

Summary

1. Implementation

  • Namespaces are dicts
  • Fast locals optimization
  • Module dict
  • Class/instance dict

2. Access

  • locals() / globals()
  • vars()
  • Frame objects
  • Direct dict access