Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions 54 Lib/importlib/_bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -490,7 +490,59 @@ def _spec_from_module(module, loader=None, origin=None):
return spec


ProxyModule = None

def _setup_proxy():
global ProxyModule
class ProxyModule(type(sys)):
def __setattr__(self, name, value):
if (spec := object.__getattribute__(self, '__spec__')) is None:
object.__setattr__(self, name, value)
return
match name:
case '__name__':
spec.name = value
case '__package__':
# This isn't right because module.__package__ and
# module.__spec__.parent have subtly different sematics.
# The latter is read-only while the former is writable.
# I'm not sure if that's intended or how to resolve it.
# Maybe we should relax the constraint on .parent?
spec.__dict__['parent'] = value
case '__loader__':
spec.loader = value
case '__file__':
spec.origin = value
case '__path__':
spec.submodule_search_location = value
case '__cached__':
spec.cached = value
case _:
object.__setattr__(self, name, value)

def __getattribute__(self, name):
if (spec := object.__getattribute__(self, '__spec__')) is None:
return object.__getattribute__(self, name)
match name:
case '__name__':
return spec.name
case '__package__':
return spec.parent
case '__loader__':
return spec.loader
case '__file__':
return spec.origin
case '__path__':
return spec.submodule_search_location
case '__cached__':
return spec.cached
case _:
return object.__getattribute__(self, name)


def _init_module_attrs(spec, module, *, override=False):
if ProxyModule is None:
_setup_proxy()
# The passed-in module may be not support attribute assignment,
# in which case we simply don't set the attributes.
# __name__
Expand Down Expand Up @@ -560,6 +612,8 @@ def _init_module_attrs(spec, module, *, override=False):
module.__cached__ = spec.cached
except AttributeError:
pass
if module.__class__ is type(sys):
module.__class__ = ProxyModule
return module


Expand Down
Morty Proxy This is a proxified and sanitized view of the page, visit original site.