From db6de0ab3d6cf83e052916cc06b73ca233802066 Mon Sep 17 00:00:00 2001 From: kirle Date: Sat, 15 Jun 2024 20:32:25 +0200 Subject: [PATCH 01/65] Fix reloading issue with multiple decorated functions Resolved a bug where only the first function decorated with would be reloaded on subsequent invocations. Also, enhanced exception handling to better manage specific cases, such as operating in non-interactive environments --- reloading/reloading.py | 155 +++++++++++++++++++++++++++-------------- 1 file changed, 103 insertions(+), 52 deletions(-) diff --git a/reloading/reloading.py b/reloading/reloading.py index 59dbd1c..192d7da 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -7,18 +7,23 @@ from functools import partial, update_wrapper -# have to make our own partial in case someone wants to use reloading as a iterator without any arguments -# they would get a partial back because a call without a iterator argument is assumed to be a decorator. -# getting a "TypeError: 'functools.partial' object is not iterable" -# which is not really descriptive. -# hence we overwrite the iter to make sure that the error makes sense. -class no_iter_partial(partial): +class NoIterPartial(partial): + """ + have to make our own partial in case someone wants to use reloading as a iterator without any arguments + they would get a partial back because a call without a iterator argument is assumed to be a decorator. + getting a "TypeError: 'functools.partial' object is not iterable" + which is not really descriptive. + hence we overwrite the iter to make sure that the error makes sense. + """ def __iter__(self): - raise TypeError("Nothing to iterate over. Please pass an iterable to reloading.") + raise TypeError( + "Nothing to iterate over. Please pass an iterable to reloading." + ) def reloading(fn_or_seq=None, every=1, forever=None): - """Wraps a loop iterator or decorates a function to reload the source code + """ + Wraps a loop iterator or decorates a function to reload the source code before every loop iteration or function invocation. When wrapped around the outermost iterator in a `for` loop, e.g. @@ -37,29 +42,39 @@ def reloading(fn_or_seq=None, every=1, forever=None): every (int, Optional): After how many iterations/invocations to reload forever (bool, Optional): Pass `forever=true` instead of an iterator to create an endless loop - """ - if fn_or_seq: - if isinstance(fn_or_seq, types.FunctionType): - return _reloading_function(fn_or_seq, every=every) - return _reloading_loop(fn_or_seq, every=every) + if forever and fn_or_seq is not None: + raise ValueError( + "Cannot use `forever=True` and pass an iterator at the same time" + ) if forever: return _reloading_loop(iter(int, 1), every=every) + if fn_or_seq: + if isinstance(fn_or_seq, types.FunctionType): + return _reloading_function(fn_or_seq, every=every) + if hasattr(fn_or_seq, "__iter__"): + return _reloading_loop(fn_or_seq, every=every) + raise TypeError( + f"{reloading.__name__} expected function or iterable, got {type(fn_or_seq)}" + ) # return this function with the keyword arguments partialed in, # so that the return value can be used as a decorator - decorator = update_wrapper(no_iter_partial(reloading, every=every), reloading) + decorator = update_wrapper(NoIterPartial(reloading, every=every), reloading) return decorator def unique_name(used): - # get the longest element of the used names and append a "0" + """ + Get the longest element of the used names and append a "0" + """ return max(used, key=len) + "0" def format_itervars(ast_node): - """Formats an `ast_node` of loop iteration variables as string, e.g. 'a, b'""" - + """ + Formats an `ast_node` of loop iteration variables as string, e.g. 'a, b' + """ # handle the case that there only is a single loop var if isinstance(ast_node, ast.Name): return ast_node.id @@ -78,7 +93,7 @@ def format_itervars(ast_node): def load_file(path): src = "" # while loop here since while saving, the file may sometimes be empty. - while (src == ""): + while src == "": with open(path, "r") as f: src = f.read() return src + "\n" @@ -96,8 +111,10 @@ def parse_file_until_successful(path): def isolate_loop_body_and_get_itervars(tree, lineno, loop_id): - """Modifies tree inplace as unclear how to create ast.Module. - Returns itervars""" + """ + Modifies tree inplace as unclear how to create ast.Module. + Returns itervars + """ candidate_nodes = [] for node in ast.walk(tree): if ( @@ -105,10 +122,10 @@ def isolate_loop_body_and_get_itervars(tree, lineno, loop_id): and isinstance(node.iter, ast.Call) and node.iter.func.id == "reloading" and ( - (loop_id is not None and loop_id == get_loop_id(node)) - or getattr(node, "lineno", None) == lineno - ) - ): + (loop_id is not None and loop_id == get_loop_id(node)) + or getattr(node, "lineno", None) == lineno + ) + ): candidate_nodes.append(node) if len(candidate_nodes) > 1: @@ -127,7 +144,8 @@ def isolate_loop_body_and_get_itervars(tree, lineno, loop_id): def get_loop_id(ast_node): - """Generates a unique identifier for an `ast_node` of type ast.For to find the loop in the changed source file + """ + Generates a unique identifier for an `ast_node` of type ast.For to find the loop in the changed source file """ return ast.dump(ast_node.target) + "__" + ast.dump(ast_node.iter) @@ -137,18 +155,39 @@ def get_loop_code(loop_frame_info, loop_id): while True: tree = parse_file_until_successful(fpath) try: - itervars, found_loop_id = isolate_loop_body_and_get_itervars(tree, lineno=loop_frame_info[2], loop_id=loop_id) - return compile(tree, filename="", mode="exec"), format_itervars(itervars), found_loop_id + itervars, found_loop_id = isolate_loop_body_and_get_itervars( + tree, lineno=loop_frame_info[2], loop_id=loop_id + ) + return ( + compile(tree, filename="", mode="exec"), + format_itervars(itervars), + found_loop_id, + ) except LookupError: handle_exception(fpath) def handle_exception(fpath): exc = traceback.format_exc() - exc = exc.replace('File ""', 'File "{}"'.format(fpath)) + exc = exc.replace('File ""', f'File "{fpath}"') sys.stderr.write(exc + "\n") - print("Edit {} and press return to continue".format(fpath)) - sys.stdin.readline() + + if sys.stdin.isatty(): + print( + f"An error occurred. Please edit the file '{fpath}' to fix the issue and press return to continue or Ctrl+C to exit." + ) + try: + sys.stdin.readline() + except KeyboardInterrupt: + print("\nExiting...") + sys.exit(1) + else: + # get error line number + line_number = int(exc.split(", line ")[-1].split(",")[0]) + print(line_number) + raise Exception( + f"An error occurred. Please fix the issue in the file '{fpath}' and run the script again." + ) def _reloading_loop(seq, every=1): @@ -158,19 +197,21 @@ def _reloading_loop(seq, every=1): caller_globals = loop_frame_info[0].f_globals caller_locals = loop_frame_info[0].f_locals - # create a unique name in the caller namespace that we can safely write - # the values of the iteration variables into unique = unique_name(chain(caller_locals.keys(), caller_globals.keys())) loop_id = None for i, itervar_values in enumerate(seq): if i % every == 0: - compiled_body, itervars, loop_id = get_loop_code(loop_frame_info, loop_id=loop_id) + compiled_body, itervars, loop_id = get_loop_code( + loop_frame_info, loop_id=loop_id + ) caller_locals[unique] = itervar_values exec(itervars + " = " + unique, caller_globals, caller_locals) + print(itervars) try: # run main loop body + # print(f"{caller_locals.keys()}") exec(compiled_body, caller_globals, caller_locals) except Exception: handle_exception(fpath) @@ -191,32 +232,36 @@ def get_decorator_name_or_none(dec_node): def strip_reloading_decorator(func): """Remove the 'reloading' decorator and all decorators before it""" - decorator_names = [get_decorator_name(dec) for dec in func.decorator_list] + decorator_names = [get_decorator_name_or_none(dec) for dec in func.decorator_list] reloading_idx = decorator_names.index("reloading") - func.decorator_list = func.decorator_list[reloading_idx + 1:] + func.decorator_list = func.decorator_list[reloading_idx + 1 :] -def isolate_function_def(funcname, tree): +def isolate_function_def(qualname, fn, tree): """Strip everything but the function definition from the ast in-place. Also strips the reloading decorator from the function definition""" + length = len(qualname.split(".")) + funcname = qualname.split(".")[-1] + classname = qualname.split(".")[length - 2] if length > 1 else None + + found = False for node in ast.walk(tree): - if ( - isinstance(node, ast.FunctionDef) - and node.name == funcname - and "reloading" in [ - get_decorator_name_or_none(dec) - for dec in node.decorator_list - ] - ): - strip_reloading_decorator(node) - tree.body = [ node ] - return True - return False + if isinstance(node, ast.ClassDef) and node.name == classname: + for subnode in node.body: + if isinstance(subnode, ast.FunctionDef) and subnode.name == funcname: + if "reloading" in [ + get_decorator_name_or_none(dec) + for dec in subnode.decorator_list + ]: + strip_reloading_decorator(subnode) + tree.body = [subnode] + found = True + return found def get_function_def_code(fpath, fn): tree = parse_file_until_successful(fpath) - found = isolate_function_def(fn.__name__, tree) + found = isolate_function_def(fn.__qualname__, fn, tree) if not found: return None compiled = compile(tree, filename="", mode="exec") @@ -243,13 +288,16 @@ def _reloading_function(fn, every=1): # crutch to use dict as python2 doesn't support nonlocal state = { - "func": None, + "func": fn, "reloads": 0, } def wrapped(*args, **kwargs): if state["reloads"] % every == 0: - state["func"] = get_reloaded_function(caller_globals, caller_locals, fpath, fn) or state["func"] + state["func"] = ( + get_reloaded_function(caller_globals, caller_locals, fpath, fn) + or state["func"] + ) state["reloads"] += 1 while True: try: @@ -257,7 +305,10 @@ def wrapped(*args, **kwargs): return result except Exception: handle_exception(fpath) - state["func"] = get_reloaded_function(caller_globals, caller_locals, fpath, fn) or state["func"] + state["func"] = ( + get_reloaded_function(caller_globals, caller_locals, fpath, fn) + or state["func"] + ) caller_locals[fn.__name__] = wrapped return wrapped From fb079295f0ab32d18d26e7d880a532ee18d011a3 Mon Sep 17 00:00:00 2001 From: nneskildsf <54531016+nneskildsf@users.noreply.github.com> Date: Sat, 14 Dec 2024 09:36:10 +0100 Subject: [PATCH 02/65] Preserve signature of wrapped function. --- reloading/reloading.py | 1 + 1 file changed, 1 insertion(+) diff --git a/reloading/reloading.py b/reloading/reloading.py index 59dbd1c..d1e368f 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -259,5 +259,6 @@ def wrapped(*args, **kwargs): handle_exception(fpath) state["func"] = get_reloaded_function(caller_globals, caller_locals, fpath, fn) or state["func"] + wrapped.__signature__ = inspect.signature(fn) caller_locals[fn.__name__] = wrapped return wrapped From b7e6b953a0205e197c68373db9706c07ea68bcd3 Mon Sep 17 00:00:00 2001 From: nneskildsf <54531016+nneskildsf@users.noreply.github.com> Date: Sat, 14 Dec 2024 09:56:47 +0100 Subject: [PATCH 03/65] Add test case regarding preservation of function signature --- reloading/test_reloading.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/reloading/test_reloading.py b/reloading/test_reloading.py index e541114..447d449 100644 --- a/reloading/test_reloading.py +++ b/reloading/test_reloading.py @@ -200,7 +200,15 @@ def test_reloading_function(self): bin=bin, ) self.assertTrue("3" in stdout and "1" in stdout) - + + def test_function_signature_is_preserved(self): + import inspect + @reloading + def some_func(a, b, c): + return "result" + + self.assertTrue(str(inspect.signature(some_func)) == "(a, b, c)") + def test_changing_source_function(self): for bin in ["python", "python3"]: stdout, _ = run_and_update_source( From d4eb21bdc5d2c454c068df61408845f685da5c3f Mon Sep 17 00:00:00 2001 From: nneskildsf <54531016+nneskildsf@users.noreply.github.com> Date: Sat, 14 Dec 2024 09:57:21 +0100 Subject: [PATCH 04/65] Fix typo --- reloading/reloading.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reloading/reloading.py b/reloading/reloading.py index d1e368f..dfc7c43 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -191,7 +191,7 @@ def get_decorator_name_or_none(dec_node): def strip_reloading_decorator(func): """Remove the 'reloading' decorator and all decorators before it""" - decorator_names = [get_decorator_name(dec) for dec in func.decorator_list] + decorator_names = [get_decorator_name_or_none(dec) for dec in func.decorator_list] reloading_idx = decorator_names.index("reloading") func.decorator_list = func.decorator_list[reloading_idx + 1:] From 0ae48c50c65e2087487cb75d26179bcfef215d93 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Sun, 15 Dec 2024 20:58:23 +0100 Subject: [PATCH 05/65] Configure testing workflow --- .github/workflows/python-testing.yml | 40 ++++++++++++++++++++++++++++ MANIFEST | 6 ----- Makefile | 12 --------- pyproject.toml | 37 +++++++++++++++++++++++++ setup.cfg | 2 -- setup.py | 35 ------------------------ 6 files changed, 77 insertions(+), 55 deletions(-) create mode 100644 .github/workflows/python-testing.yml delete mode 100644 MANIFEST delete mode 100644 Makefile create mode 100644 pyproject.toml delete mode 100644 setup.cfg delete mode 100644 setup.py diff --git a/.github/workflows/python-testing.yml b/.github/workflows/python-testing.yml new file mode 100644 index 0000000..6a30578 --- /dev/null +++ b/.github/workflows/python-testing.yml @@ -0,0 +1,40 @@ +name: Python application + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.4", "3.5", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"] + steps: + - uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: python -m pip install --upgrade pip + - name: Install relaoding (as editable) + run: pip install -e ".[development]" + - name: Lint with flake8. Stop if syntax errors or undefined variables. + run: | + cd reloading + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + - name: Lint with flake8. Get warnings. + run: | + cd reloading + if ! flake8 . --count --statistics; then + echo "::warning::Flake8 Lint Warning" + fi + - name: Type check with pyright + run: pyright + - name: Test with unittest + run: | + cd reloading + python -m unittest diff --git a/MANIFEST b/MANIFEST deleted file mode 100644 index d4a6512..0000000 --- a/MANIFEST +++ /dev/null @@ -1,6 +0,0 @@ -# file GENERATED by distutils, do NOT edit -setup.cfg -setup.py -reloading/__init__.py -reloading/reloading.py -reloading/test_reloading.py diff --git a/Makefile b/Makefile deleted file mode 100644 index e3a8b06..0000000 --- a/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -PWD := $(shell pwd) - -.PHONY: test -test: test3.6 test3.7 test3.8 - -test3.6: - docker run -w /app -v $(PWD):/app python:3.6.10-alpine3.11 python -m unittest -test3.7: - docker run -w /app -v $(PWD):/app python:3.7.7-alpine3.11 python -m unittest -test3.8: - docker run -w /app -v $(PWD):/app python:3.8.3-alpine3.11 python -m unittest - diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b58c169 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,37 @@ +[build-system] +requires = ["flit_core >=3.2,<4"] +build-backend = "flit_core.buildapi" + +[project] +name = "reloading" +dependencies = [] +requires-python = ">=3.4" +authors = [{name = "Julian Vossen", email = "pypi@julianvossen.de"}] +maintainers = [{name = "Eskild Schroll-Fleischer", email = "eyfl@novonordisk.com"}] +version="1.1.2" +license = {file = "LICENSE.txt"} +readme = "README.md" +description = "Reloads source code of a running program without losing state" +keywords = ["reload", "reloading", "refresh", "loop", "decorator"] +classifiers=[ + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "Topic :: Utilities", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.4", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", +] + +[project.urls] +Repository = "https://github.com/julvo/reloading" + +[project.optional-dependencies] +development = [ + "flake8", + "build", +] diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index b88034e..0000000 --- a/setup.cfg +++ /dev/null @@ -1,2 +0,0 @@ -[metadata] -description-file = README.md diff --git a/setup.py b/setup.py deleted file mode 100644 index 74f5255..0000000 --- a/setup.py +++ /dev/null @@ -1,35 +0,0 @@ -from setuptools import setup -from os import path - -this_directory = path.abspath(path.dirname(__file__)) -with open(path.join(this_directory, 'README.md'), encoding='utf-8') as f: - long_description = f.read() - -setup( - name='reloading', - packages=['reloading'], - version='1.1.2', - license='MIT', - description='Reloads source code of a running program without losing state', - long_description=long_description, - long_description_content_type='text/markdown', - author='Julian Vossen', - author_email='pypi@julianvossen.de', - url='https://github.com/julvo/reloading', - download_url='https://github.com/julvo/reloading/archive/v1.1.2.tar.gz', - keywords=['reload', 'reloading', 'refresh', 'loop', 'decorator'], - install_requires=[], - classifiers=[ - 'Development Status :: 3 - Alpha', - 'Intended Audience :: Developers', - 'Topic :: Utilities', - 'License :: OSI Approved :: MIT License', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.4', - 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: 3.8', - 'Programming Language :: Python :: 3.9', - ], -) From 502533d2552b715b9483cd4f5319987bffb00754 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Sun, 15 Dec 2024 21:07:03 +0100 Subject: [PATCH 06/65] Specify exact version numbers of Python --- .github/workflows/python-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-testing.yml b/.github/workflows/python-testing.yml index 6a30578..d2263a1 100644 --- a/.github/workflows/python-testing.yml +++ b/.github/workflows/python-testing.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.4", "3.5", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"] + python-version: ["3.4.10", "3.5.10", "3.6.15", "3.7.17", "3.8.18", "3.9.20", "3.10.15", "3.11.11", "3.12.8", "3.13.1"] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} From da57c51278b33123a8035101b85b7ba0a9329659 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Sun, 15 Dec 2024 21:09:04 +0100 Subject: [PATCH 07/65] Test python versions relevant for Ubuntu 22.04 --- .github/workflows/python-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-testing.yml b/.github/workflows/python-testing.yml index d2263a1..43f0793 100644 --- a/.github/workflows/python-testing.yml +++ b/.github/workflows/python-testing.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.4.10", "3.5.10", "3.6.15", "3.7.17", "3.8.18", "3.9.20", "3.10.15", "3.11.11", "3.12.8", "3.13.1"] + python-version: ["3.7.17", "3.8.18", "3.9.20", "3.10.15", "3.11.11", "3.12.8", "3.13.1"] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} From 368f5392bcaa132d2164261bb2582461035423bd Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Sun, 15 Dec 2024 21:10:11 +0100 Subject: [PATCH 08/65] Test python versions relevant for Ubuntu 24.04 --- .github/workflows/python-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-testing.yml b/.github/workflows/python-testing.yml index 43f0793..4d152d7 100644 --- a/.github/workflows/python-testing.yml +++ b/.github/workflows/python-testing.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.7.17", "3.8.18", "3.9.20", "3.10.15", "3.11.11", "3.12.8", "3.13.1"] + python-version: ["3.8.18", "3.9.20", "3.10.15", "3.11.11", "3.12.8", "3.13.1"] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} From 6b7bdfaf4a54c85e5140bee3966e1e2944b343cf Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Sun, 15 Dec 2024 21:13:18 +0100 Subject: [PATCH 09/65] Add pyright as developer dependency --- pyproject.toml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index b58c169..c208c4e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,6 +32,7 @@ Repository = "https://github.com/julvo/reloading" [project.optional-dependencies] development = [ - "flake8", - "build", + "flake8", + "pyright", + "build", ] From 0a0036ce97e4022d902d0890d5781192bfafc050 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Tue, 17 Dec 2024 06:02:21 +0100 Subject: [PATCH 10/65] Add typing. Fix tests. Add comments. --- pyproject.toml | 7 + reloading/__init__.py | 2 +- reloading/reloading.py | 381 +++++++++++++++++++++--------------- reloading/test_reloading.py | 102 +++++----- 4 files changed, 272 insertions(+), 220 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c208c4e..2d537dc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,3 +36,10 @@ development = [ "pyright", "build", ] + +[tool.pyright] +include = ["reloading"] +exclude = [ + "**/__pycache__", + "examples", +] diff --git a/reloading/__init__.py b/reloading/__init__.py index dffa171..f566150 100644 --- a/reloading/__init__.py +++ b/reloading/__init__.py @@ -1 +1 @@ -from .reloading import reloading +from .reloading import reloading as reloading diff --git a/reloading/reloading.py b/reloading/reloading.py index de96030..2136044 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -3,25 +3,35 @@ import ast import traceback import types +from typing import Optional, Union, Callable, Iterable, Dict, Any, overload from itertools import chain from functools import partial, update_wrapper - +from copy import deepcopy class NoIterPartial(partial): """ - have to make our own partial in case someone wants to use reloading as a iterator without any arguments - they would get a partial back because a call without a iterator argument is assumed to be a decorator. - getting a "TypeError: 'functools.partial' object is not iterable" - which is not really descriptive. - hence we overwrite the iter to make sure that the error makes sense. + Make our own partial in case someone wants to use reloading as an + iterator. Without any arguments they would get a partial back + because a call without an iterator argument is assumed to be a decorator. + Getting a "TypeError: 'functools.partial' object is not iterable" + is not really descriptive. + Hence we overwrite the iter to make sure that the error makes sense. """ def __iter__(self): raise TypeError( "Nothing to iterate over. Please pass an iterable to reloading." ) +@overload +def reloading(fn_or_seq: Iterable) -> Iterable: ... + +@overload +def reloading(fn_or_seq: None) -> Iterable: ... + +@overload +def reloading(fn_or_seq: Callable) -> Callable: ... -def reloading(fn_or_seq=None, every=1, forever=None): +def reloading(fn_or_seq: Optional[Union[Iterable, Callable]] = None) -> Union[Iterable, Callable]: """ Wraps a loop iterator or decorates a function to reload the source code before every loop iteration or function invocation. @@ -32,50 +42,48 @@ def reloading(fn_or_seq=None, every=1, forever=None): When used as a function decorator, the decorated function is reloaded from source before each execution. - Pass the integer keyword argument `every` to reload the source code - only every n-th iteration/invocation. - Args: fn_or_seq (function | iterable): A function or loop iterator which should be reloaded from source before each invocation or iteration, - respectively - every (int, Optional): After how many iterations/invocations to reload - forever (bool, Optional): Pass `forever=true` instead of an iterator to - create an endless loop + respectively. """ - if forever and fn_or_seq is not None: - raise ValueError( - "Cannot use `forever=True` and pass an iterator at the same time" - ) - if forever: - return _reloading_loop(iter(int, 1), every=every) - if fn_or_seq: - if isinstance(fn_or_seq, types.FunctionType): - return _reloading_function(fn_or_seq, every=every) - if hasattr(fn_or_seq, "__iter__"): - return _reloading_loop(fn_or_seq, every=every) - raise TypeError( - f"{reloading.__name__} expected function or iterable, got {type(fn_or_seq)}" - ) + if isinstance(fn_or_seq, Callable): + return _reloading_function(fn_or_seq) + elif isinstance(fn_or_seq, Iterable): + return _reloading_loop(fn_or_seq) + else: + raise TypeError( + f"{reloading.__name__} expected function or iterable, got {type(fn_or_seq)}" + ) + else: + return _reloading_loop(iter(int, 1)) # return this function with the keyword arguments partialed in, # so that the return value can be used as a decorator - decorator = update_wrapper(NoIterPartial(reloading, every=every), reloading) + decorator = update_wrapper(NoIterPartial(reloading), reloading) return decorator -def unique_name(used): +def unique_name(seq: chain) -> str: """ - Get the longest element of the used names and append a "0" + Function to generate string which is unique + relative to the supplied sequence """ - return max(used, key=len) + "0" + return max(seq, key=len) + "0" -def format_itervars(ast_node): +def format_iteration_variables(ast_node: Union[ast.Name, ast.Tuple, ast.List]) -> str: """ - Formats an `ast_node` of loop iteration variables as string, e.g. 'a, b' + Formats an `ast_node` of loop iteration variables as string. """ - # handle the case that there only is a single loop var + # ast.Name corresponds to cases where the iterator returns + # a single element. + # Example: + # for i in range(10): + # pass + # ast.Tuple/ast.List corresponds to multiple elements: + # for i, j in zip(range(10), range(10)): + # pass if isinstance(ast_node, ast.Name): return ast_node.id @@ -84,50 +92,53 @@ def format_itervars(ast_node): if isinstance(child, ast.Name): names.append(child.id) elif isinstance(child, ast.Tuple) or isinstance(child, ast.List): - # if its another tuple, like "a, (b, c)", recurse - names.append("({})".format(format_itervars(child))) + # Recursion to handle additional tuples such as "a, (b, c)" + names.append("("+format_iteration_variables(child)+")") return ", ".join(names) -def load_file(path): - src = "" - # while loop here since while saving, the file may sometimes be empty. - while src == "": - with open(path, "r") as f: +def load_file(filepath: str) -> str: + """ + Read contents of file containing reloading code. + Handle case of file appearing empty on read. + """ + while True: + with open(filepath, "r") as f: src = f.read() - return src + "\n" + if len(src): + return src + "\n" -def parse_file_until_successful(path): - source = load_file(path) +def parse_file_until_successful(filepath: str) -> ast.Module: + """ + Parse source code of file containing reloading code. + File may appear incomplete as as it is read so retry until successful. + """ + source = load_file(filepath) while True: try: tree = ast.parse(source) return tree except SyntaxError: - handle_exception(path) - source = load_file(path) + handle_exception(filepath) + source = load_file(filepath) -def isolate_loop_body_and_get_itervars(tree, lineno, loop_id): +def isolate_loop_body_and_get_iteration_variables(reloaded_file_ast: ast.Module, + lineno: int, + loop_id: Union[None, str]) -> tuple[ast.Module, ast.Name, str]: """ - Modifies tree inplace as unclear how to create ast.Module. - Returns itervars + Traverse AST for the entire reloaded file in a search for the + loop which is reloaded. """ candidate_nodes = [] - for node in ast.walk(tree): - if ( - isinstance(node, ast.For) - and isinstance(node.iter, ast.Call) - and node.iter.func.id == "reloading" - and ( + for node in ast.walk(reloaded_file_ast): + if isinstance(node, ast.For) and isinstance(node.iter, ast.Call): + if getattr(node.iter.func, "id") == "reloading" and ( (loop_id is not None and loop_id == get_loop_id(node)) - or getattr(node, "lineno", None) == lineno - ) - ): - candidate_nodes.append(node) - + or getattr(node, "lineno", None) == lineno): + candidate_nodes.append(node) if len(candidate_nodes) > 1: raise LookupError( "The reloading loop is ambigious. Use `reloading` only once per line and make sure that the code in that line is unique within the source file." @@ -139,42 +150,47 @@ def isolate_loop_body_and_get_itervars(tree, lineno, loop_id): ) loop_node = candidate_nodes[0] - tree.body = loop_node.body - return loop_node.target, get_loop_id(loop_node) + for_loop_ast = deepcopy(reloaded_file_ast) # Use reloaded_file_ast as template. + for_loop_ast.body = loop_node.body + return for_loop_ast, loop_node.target, get_loop_id(loop_node) -def get_loop_id(ast_node): +def get_loop_id(ast_node: ast.For) -> str: """ - Generates a unique identifier for an `ast_node` of type ast.For to find the loop in the changed source file + Generates a unique identifier for an `ast_node`. + Used to identify the loop in the changed source file. """ return ast.dump(ast_node.target) + "__" + ast.dump(ast_node.iter) -def get_loop_code(loop_frame_info, loop_id): - fpath = loop_frame_info[1] +def get_loop_code(loop_frame_info: inspect.FrameInfo, loop_id: Union[None, str]) -> tuple[ast.Module, str, str]: # Return code object + filepath: str = loop_frame_info.filename while True: - tree = parse_file_until_successful(fpath) + reloaded_file_ast: ast.Module = parse_file_until_successful(filepath) try: - itervars, found_loop_id = isolate_loop_body_and_get_itervars( - tree, lineno=loop_frame_info[2], loop_id=loop_id + for_loop_ast, iteration_variables, found_loop_id = isolate_loop_body_and_get_iteration_variables( + reloaded_file_ast, lineno=loop_frame_info.lineno, loop_id=loop_id ) return ( - compile(tree, filename="", mode="exec"), - format_itervars(itervars), + for_loop_ast, + format_iteration_variables(iteration_variables), found_loop_id, ) except LookupError: - handle_exception(fpath) + handle_exception(filepath) -def handle_exception(fpath): - exc = traceback.format_exc() - exc = exc.replace('File ""', f'File "{fpath}"') - sys.stderr.write(exc + "\n") +def handle_exception(filepath: str): + """ + Output helpful error message to user regarding exception in reloaded code. + """ + exception = traceback.format_exc() + exception = exception.replace('File ""', f'File "{filepath}"') + sys.stderr.write(exception + "\n") if sys.stdin.isatty(): print( - f"An error occurred. Please edit the file '{fpath}' to fix the issue and press return to continue or Ctrl+C to exit." + f"An error occurred. Please edit the file '{filepath}' to fix the issue and press return to continue or Ctrl+C to exit." ) try: sys.stdin.readline() @@ -183,133 +199,174 @@ def handle_exception(fpath): sys.exit(1) else: # get error line number - line_number = int(exc.split(", line ")[-1].split(",")[0]) + line_number = int(exception.split(", line ")[-1].split(",")[0]) print(line_number) raise Exception( - f"An error occurred. Please fix the issue in the file '{fpath}' and run the script again." + f"An error occurred. Please fix the issue in the file '{filepath}' and run the script again." ) -def _reloading_loop(seq, every=1): - loop_frame_info = inspect.stack()[2] - fpath = loop_frame_info[1] +def _reloading_loop(seq: Iterable) -> Iterable: + stack: list[inspect.FrameInfo] = inspect.stack() + # The first element on the stack is the caller of inspect.stack() i.e. _reloading_loop + assert stack[0].function == '_reloading_loop' + # The second element is the caller of the first, i.e. reloading + assert stack[1].function == 'reloading' + # The third element is the loop which called reloading. + loop_frame_info: inspect.FrameInfo = stack[2] + filepath: str = loop_frame_info.filename - caller_globals = loop_frame_info[0].f_globals - caller_locals = loop_frame_info[0].f_locals + caller_globals: Dict[str, Any] = loop_frame_info.frame.f_globals + caller_locals: Dict[str, Any] = loop_frame_info.frame.f_locals - unique = unique_name(chain(caller_locals.keys(), caller_globals.keys())) + # Make up a name for a variable which is not already present in the global + # or local namespace. + vacant_variable_name: str = unique_name(chain(caller_locals.keys(), + caller_globals.keys())) loop_id = None - for i, itervar_values in enumerate(seq): - if i % every == 0: - compiled_body, itervars, loop_id = get_loop_code( - loop_frame_info, loop_id=loop_id - ) - - caller_locals[unique] = itervar_values - exec(itervars + " = " + unique, caller_globals, caller_locals) - print(itervars) + for_loop_ast, iteration_variables, loop_id = get_loop_code( + loop_frame_info, loop_id=loop_id + ) + for i, iteration_variable_values in enumerate(seq): + # Reload code + for_loop_ast, iteration_variables, loop_id = get_loop_code( + loop_frame_info, loop_id=loop_id + ) + # Store iteration variable values in vacant variable in local scope + caller_locals[vacant_variable_name] = iteration_variable_values + # Reassign variable values from vacant variable in local scope + exec(iteration_variables + " = " + vacant_variable_name, caller_globals, caller_locals) try: - # run main loop body - # print(f"{caller_locals.keys()}") + # Run loop body + compiled_body = compile(for_loop_ast, filename="", mode="exec") exec(compiled_body, caller_globals, caller_locals) except Exception: - handle_exception(fpath) + handle_exception(filepath) return [] -def get_decorator_name_or_none(dec_node): - if hasattr(dec_node, "id"): - return dec_node.id - elif hasattr(dec_node.func, "id"): - return dec_node.func.id - elif hasattr(dec_node.func.value, "id"): - return dec_node.func.value.id +def get_decorator_name_or_none(decorator_node): + if hasattr(decorator_node, "id"): + return decorator_node.id + elif hasattr(decorator_node.func, "id"): + return decorator_node.func.id + elif hasattr(decorator_node.func.value, "id"): + return decorator_node.func.value.id else: return None -def strip_reloading_decorator(func): - """Remove the 'reloading' decorator and all decorators before it""" - decorator_names = [get_decorator_name_or_none(dec) for dec in func.decorator_list] - reloading_idx = decorator_names.index("reloading") - func.decorator_list = func.decorator_list[reloading_idx + 1 :] +def strip_reloading_decorator(function_with_decorator: ast.FunctionDef): + """ + Remove the 'reloading' decorator and all decorators before it. + """ + # Find decorators + decorator_names = [get_decorator_name_or_none(dec) for dec in function_with_decorator.decorator_list] + # Find index of "reloading" decorator + reloading_index = decorator_names.index("reloading") + function_without_decorator = deepcopy(function_with_decorator) # Use function with decorator as template + function_without_decorator.decorator_list = function_with_decorator.decorator_list[reloading_index + 1:] + return function_without_decorator -def isolate_function_def(qualname, fn, tree): - """Strip everything but the function definition from the ast in-place. - Also strips the reloading decorator from the function definition""" +def isolate_function_def(qualname: str, function: Callable, reloaded_file_ast: ast.Module) -> Union[None, ast.Module]: + """ + Traverse AST for the entire reloaded file in a search for the + function (minus the reloading decorator) which is reloaded. + """ length = len(qualname.split(".")) - funcname = qualname.split(".")[-1] - classname = qualname.split(".")[length - 2] if length > 1 else None + function_name = qualname.split(".")[-1] + class_name = qualname.split(".")[length - 2] if length > 1 else None - found = False - for node in ast.walk(tree): - if isinstance(node, ast.ClassDef) and node.name == classname: + for node in ast.walk(reloaded_file_ast): + if isinstance(node, ast.ClassDef) and node.name == class_name: for subnode in node.body: - if isinstance(subnode, ast.FunctionDef) and subnode.name == funcname: + if isinstance(subnode, ast.FunctionDef) and subnode.name == function_name: if "reloading" in [ - get_decorator_name_or_none(dec) - for dec in subnode.decorator_list + get_decorator_name_or_none(decorator) + for decorator in subnode.decorator_list ]: - strip_reloading_decorator(subnode) - tree.body = [subnode] - found = True - return found - - -def get_function_def_code(fpath, fn): - tree = parse_file_until_successful(fpath) - found = isolate_function_def(fn.__qualname__, fn, tree) - if not found: - return None - compiled = compile(tree, filename="", mode="exec") - return compiled - - -def get_reloaded_function(caller_globals, caller_locals, fpath, fn): - code = get_function_def_code(fpath, fn) - if code is None: + function_node = strip_reloading_decorator(subnode) + function_node_ast = deepcopy(reloaded_file_ast) # Use reloaded_file_ast as template. + function_node_ast.body = [function_node] + return function_node_ast + if isinstance(node, ast.FunctionDef) and node.name == function_name: + if "reloading" in [ + get_decorator_name_or_none(decorator) + for decorator in node.decorator_list + ]: + function_node = strip_reloading_decorator(node) + function_node_ast = deepcopy(reloaded_file_ast) # Use reloaded_file_ast as template. + function_node_ast.body = [ function_node ] + return function_node_ast + return None + + +def get_function_def_code(filepath: str, function: Callable) -> Union[None, ast.Module]: + reloaded_file_ast: ast.Module = parse_file_until_successful(filepath) + function_ast = isolate_function_def(function.__qualname__, function, reloaded_file_ast) + return function_ast + + +def get_reloaded_function(caller_globals: Dict[str, Any], + caller_locals: Dict[str, Any], + filepath: str, + function: Callable) -> Union[None, Callable]: + function_ast = get_function_def_code(filepath, function) + if function_ast is None: return None # need to copy locals, otherwise the exec will overwrite the decorated with the undecorated new version # this became a need after removing the reloading decorator from the newly defined version caller_locals_copy = caller_locals.copy() - exec(code, caller_globals, caller_locals_copy) - func = caller_locals_copy[fn.__name__] - return func - - -def _reloading_function(fn, every=1): - stack = inspect.stack() - frame, fpath = stack[2][:2] - caller_locals = frame.f_locals - caller_globals = frame.f_globals - + compiled_body = compile(function_ast, filename="", mode="exec") + exec(compiled_body, caller_globals, caller_locals_copy) + function = caller_locals_copy[function.__name__] + return function + + +def _reloading_function(function: Callable) -> Callable: + stack: list[inspect.FrameInfo] = inspect.stack() + # The first element on the stack is the caller of inspect.stack() i.e. _reloading_function + assert stack[0].function == '_reloading_function' + # The second element is the caller of the first, i.e. reloading + assert stack[1].function == 'reloading' + # The third element is the loop which called reloading. + function_frame_info: inspect.FrameInfo = stack[2] + filepath: str = function_frame_info.filename + + caller_globals = function_frame_info.frame.f_globals + caller_locals = function_frame_info.frame.f_locals # crutch to use dict as python2 doesn't support nonlocal state = { - "func": fn, + "function": function, "reloads": 0, } def wrapped(*args, **kwargs): - if state["reloads"] % every == 0: - state["func"] = ( - get_reloaded_function(caller_globals, caller_locals, fpath, fn) - or state["func"] - ) + state["function"] = ( + get_reloaded_function(caller_globals, + caller_locals, + filepath, + function) + or state["function"] + ) state["reloads"] += 1 while True: try: - result = state["func"](*args, **kwargs) + result = state["function"](*args, **kwargs) return result except Exception: - handle_exception(fpath) + handle_exception(filepath) state["func"] = ( - get_reloaded_function(caller_globals, caller_locals, fpath, fn) - or state["func"] + get_reloaded_function(caller_globals, + caller_locals, + filepath, + function) + or state["function"] ) - wrapped.__signature__ = inspect.signature(fn) - caller_locals[fn.__name__] = wrapped + wrapped.__signature__ = inspect.signature(function) # type: ignore + caller_locals[function.__name__] = wrapped return wrapped diff --git a/reloading/test_reloading.py b/reloading/test_reloading.py index 447d449..2151e37 100644 --- a/reloading/test_reloading.py +++ b/reloading/test_reloading.py @@ -11,7 +11,7 @@ from reloading import reloading from time import sleep -for epoch in reloading(range(10)): +for epoch, ep in reloading(zip(range(10), range(1,11))): sleep(0.2) print('INITIAL_FILE_CONTENTS') """ @@ -95,7 +95,7 @@ def some_func(a, b): """ -def run_and_update_source(init_src, updated_src=None, update_after=0.5, bin="python3"): +def run_and_update_source(init_src, updated_src=None, update_after=0.5): """Runs init_src in a subprocess and updates source to updated_src after update_after seconds. Returns the standard output of the subprocess and whether the subprocess produced an uncaught exception. @@ -103,7 +103,7 @@ def run_and_update_source(init_src, updated_src=None, update_after=0.5, bin="pyt with open(SRC_FILE_NAME, "w") as f: f.write(init_src) - cmd = [bin, SRC_FILE_NAME] + cmd = ["python", SRC_FILE_NAME] with sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE) as proc: if updated_src is not None: time.sleep(update_after) @@ -114,7 +114,7 @@ def run_and_update_source(init_src, updated_src=None, update_after=0.5, bin="pyt stdout, _ = proc.communicate(timeout=2) stdout = stdout.decode("utf-8") has_error = False - except: + except Exception: stdout = "" has_error = True proc.terminate() @@ -132,58 +132,49 @@ def test_simple_looping(self): iters += 1 def test_changing_source_loop(self): - for bin in ["python", "python3"]: - stdout, _ = run_and_update_source( - init_src=TEST_CHANGING_SOURCE_LOOP_CONTENT, - updated_src=TEST_CHANGING_SOURCE_LOOP_CONTENT.replace("INITIAL", "CHANGED").rstrip("\n"), - bin=bin, - ) - - self.assertTrue("INITIAL_FILE_CONTENTS" in stdout and "CHANGED_FILE_CONTENTS" in stdout) + stdout, _ = run_and_update_source( + init_src=TEST_CHANGING_SOURCE_LOOP_CONTENT, + updated_src=TEST_CHANGING_SOURCE_LOOP_CONTENT.replace("INITIAL", "CHANGED").rstrip("\n"), + ) + print(stdout) + self.assertTrue("INITIAL_FILE_CONTENTS" in stdout and "CHANGED_FILE_CONTENTS" in stdout) def test_changing_line_number_of_loop(self): - for bin in ["python", "python3"]: - stdout, _ = run_and_update_source( - init_src=TEST_CHANGING_LINE_NUMBER_OF_LOOP, - updated_src=( - TEST_CHANGING_LINE_NUMBER_OF_LOOP - .replace("pass", "pass\npass\n") - .replace("INITIAL", "CHANGED") - .rstrip("\n") - ), - bin=bin, - ) - - self.assertTrue("INITIAL_FILE_CONTENTS" in stdout and "CHANGED_FILE_CONTENTS" in stdout) + stdout, _ = run_and_update_source( + init_src=TEST_CHANGING_LINE_NUMBER_OF_LOOP, + updated_src=( + TEST_CHANGING_LINE_NUMBER_OF_LOOP + .replace("pass", "pass\npass\n") + .replace("INITIAL", "CHANGED") + .rstrip("\n") + ), + ) + print(stdout) + self.assertTrue("INITIAL_FILE_CONTENTS" in stdout and "CHANGED_FILE_CONTENTS" in stdout) def test_comment_after_loop(self): - for bin in ["python", "python3"]: - stdout, _ = run_and_update_source( - init_src=TEST_COMMENT_AFTER_LOOP_CONTENT, - updated_src=TEST_COMMENT_AFTER_LOOP_CONTENT.replace("INITIAL", "CHANGED").rstrip("\n"), - bin=bin, - ) + stdout, _ = run_and_update_source( + init_src=TEST_COMMENT_AFTER_LOOP_CONTENT, + updated_src=TEST_COMMENT_AFTER_LOOP_CONTENT.replace("INITIAL", "CHANGED").rstrip("\n"), + ) - self.assertTrue("INITIAL_FILE_CONTENTS" in stdout and "CHANGED_FILE_CONTENTS" in stdout) + self.assertTrue("INITIAL_FILE_CONTENTS" in stdout and "CHANGED_FILE_CONTENTS" in stdout) def test_format_str_in_loop(self): stdout, _ = run_and_update_source( init_src=TEST_FORMAT_STR_IN_LOOP_CONTENT, updated_src=TEST_FORMAT_STR_IN_LOOP_CONTENT.replace("INITIAL", "CHANGED").rstrip("\n"), - bin="python3", ) self.assertTrue("INITIAL_FILE_CONTENTS" in stdout and "CHANGED_FILE_CONTENTS" in stdout) def test_keep_local_variables(self): - for bin in ["python", "python3"]: - _, has_error = run_and_update_source(init_src=TEST_KEEP_LOCAL_VARIABLES_CONTENT, bin=bin) - self.assertFalse(has_error) + _, has_error = run_and_update_source(init_src=TEST_KEEP_LOCAL_VARIABLES_CONTENT) + self.assertFalse(has_error) def test_persist_after_loop(self): - for bin in ["python", "python3"]: - _, has_error = run_and_update_source(init_src=TEST_PERSIST_AFTER_LOOP, bin=bin) - self.assertFalse(has_error) + _, has_error = run_and_update_source(init_src=TEST_PERSIST_AFTER_LOOP) + self.assertFalse(has_error) def test_simple_function(self): @reloading @@ -193,31 +184,28 @@ def some_func(): self.assertTrue(some_func() == "result") def test_reloading_function(self): - for bin in ["python", "python3"]: - stdout, _ = run_and_update_source( - init_src=TEST_FUNCTION_AFTER, - updated_src=TEST_FUNCTION_AFTER.replace("a+b", "a-b"), - bin=bin, - ) - self.assertTrue("3" in stdout and "1" in stdout) - + stdout, _ = run_and_update_source( + init_src=TEST_FUNCTION_AFTER, + updated_src=TEST_FUNCTION_AFTER.replace("a+b", "a-b"), + ) + self.assertTrue("3" in stdout and "1" in stdout) + def test_function_signature_is_preserved(self): import inspect + @reloading def some_func(a, b, c): return "result" - + self.assertTrue(str(inspect.signature(some_func)) == "(a, b, c)") - + def test_changing_source_function(self): - for bin in ["python", "python3"]: - stdout, _ = run_and_update_source( - init_src=TEST_CHANGING_SOURCE_FN_CONTENT, - updated_src=TEST_CHANGING_SOURCE_FN_CONTENT.replace("INITIAL", "CHANGED").rstrip("\n"), - bin=bin, - ) - - self.assertTrue("INITIAL_FILE_CONTENTS" in stdout and "CHANGED_FILE_CONTENTS" in stdout) + stdout, _ = run_and_update_source( + init_src=TEST_CHANGING_SOURCE_FN_CONTENT, + updated_src=TEST_CHANGING_SOURCE_FN_CONTENT.replace("INITIAL", "CHANGED").rstrip("\n"), + ) + print(stdout) + self.assertTrue("INITIAL_FILE_CONTENTS" in stdout and "CHANGED_FILE_CONTENTS" in stdout) if __name__ == "__main__": From 21bf0c27b01763b3bc04f3acfc962162309a818c Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Tue, 17 Dec 2024 06:06:48 +0100 Subject: [PATCH 11/65] Fix typing for python 3.8 --- reloading/reloading.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reloading/reloading.py b/reloading/reloading.py index 2136044..af785a6 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -3,7 +3,7 @@ import ast import traceback import types -from typing import Optional, Union, Callable, Iterable, Dict, Any, overload +from typing import Optional, Union, Callable, Iterable, Dict, Any, overload, Tuple, List from itertools import chain from functools import partial, update_wrapper from copy import deepcopy @@ -127,7 +127,7 @@ def parse_file_until_successful(filepath: str) -> ast.Module: def isolate_loop_body_and_get_iteration_variables(reloaded_file_ast: ast.Module, lineno: int, - loop_id: Union[None, str]) -> tuple[ast.Module, ast.Name, str]: + loop_id: Union[None, str]) -> Tuple[ast.Module, ast.Name, str]: """ Traverse AST for the entire reloaded file in a search for the loop which is reloaded. @@ -163,7 +163,7 @@ def get_loop_id(ast_node: ast.For) -> str: return ast.dump(ast_node.target) + "__" + ast.dump(ast_node.iter) -def get_loop_code(loop_frame_info: inspect.FrameInfo, loop_id: Union[None, str]) -> tuple[ast.Module, str, str]: # Return code object +def get_loop_code(loop_frame_info: inspect.FrameInfo, loop_id: Union[None, str]) -> Tuple[ast.Module, str, str]: filepath: str = loop_frame_info.filename while True: reloaded_file_ast: ast.Module = parse_file_until_successful(filepath) @@ -207,7 +207,7 @@ def handle_exception(filepath: str): def _reloading_loop(seq: Iterable) -> Iterable: - stack: list[inspect.FrameInfo] = inspect.stack() + stack: List[inspect.FrameInfo] = inspect.stack() # The first element on the stack is the caller of inspect.stack() i.e. _reloading_loop assert stack[0].function == '_reloading_loop' # The second element is the caller of the first, i.e. reloading @@ -327,7 +327,7 @@ def get_reloaded_function(caller_globals: Dict[str, Any], def _reloading_function(function: Callable) -> Callable: - stack: list[inspect.FrameInfo] = inspect.stack() + stack: List[inspect.FrameInfo] = inspect.stack() # The first element on the stack is the caller of inspect.stack() i.e. _reloading_function assert stack[0].function == '_reloading_function' # The second element is the caller of the first, i.e. reloading From d2350539f6bd3714e94982cf793c5737056010c1 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Tue, 17 Dec 2024 06:14:55 +0100 Subject: [PATCH 12/65] Bump version number reflecting API change. Upadte list of supported python versions. Update readme to reflect API change. --- README.md | 24 ++++++------------------ pyproject.toml | 16 ++++++++-------- 2 files changed, 14 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 623757d..7903a72 100644 --- a/README.md +++ b/README.md @@ -41,22 +41,9 @@ def some_function(): ## Additional Options -Pass the keyword argument `every` to reload only on every n-th invocation or iteration. E.g. +Pass `None` instead of an iterable to create an endless reloading loop, e.g. ```python -for i in reloading(range(1000), every=10): - # this code will only be reloaded before every 10th iteration - # this can help to speed-up tight loops - pass - -@reloading(every=10) -def some_function(): - # this code with only be reloaded before every 10th invocation - pass -``` - -Pass `forever=True` instead of an iterable to create an endless reloading loop, e.g. -```python -for i in reloading(forever=True): +for i in reloading(): # this code will loop forever and reload from source before each iteration pass ``` @@ -148,9 +135,10 @@ for epoch in reloading(range(NB_EPOCHS)): ``` [Here](https://github.com/julvo/reloading/blob/master/examples/tensorflow/train.py) is a full TensorFlow example. -## Testing +## Type Check and Testing -Make sure you have `python` and `python3` available in your path, then run: +Run: ``` -$ python3 reloading/test_reloading.py +$ pyright +$ python reloading/test_reloading.py ``` diff --git a/pyproject.toml b/pyproject.toml index 2d537dc..bf83821 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,13 +5,13 @@ build-backend = "flit_core.buildapi" [project] name = "reloading" dependencies = [] -requires-python = ">=3.4" +requires-python = ">=3.8" authors = [{name = "Julian Vossen", email = "pypi@julianvossen.de"}] maintainers = [{name = "Eskild Schroll-Fleischer", email = "eyfl@novonordisk.com"}] -version="1.1.2" +version="1.2.0" license = {file = "LICENSE.txt"} readme = "README.md" -description = "Reloads source code of a running program without losing state" +description = "Reloads source code of a running program without losing state." keywords = ["reload", "reloading", "refresh", "loop", "decorator"] classifiers=[ "Development Status :: 3 - Alpha", @@ -19,16 +19,16 @@ classifiers=[ "Topic :: Utilities", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.4", - "Programming Language :: Python :: 3.5", - "Programming Language :: Python :: 3.6", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] [project.urls] -Repository = "https://github.com/julvo/reloading" +Repository = "https://github.com/eskildsf/reloading" [project.optional-dependencies] development = [ From c63fe0ca0e29d991a41ab2015b569ebd977f70ee Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Tue, 17 Dec 2024 06:16:54 +0100 Subject: [PATCH 13/65] Bump version number reflecting API change. Upadte list of supported python versions. Update readme to reflect API change. --- README.md | 24 ++++++------------------ pyproject.toml | 23 +++++++++++++++-------- 2 files changed, 21 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 623757d..7903a72 100644 --- a/README.md +++ b/README.md @@ -41,22 +41,9 @@ def some_function(): ## Additional Options -Pass the keyword argument `every` to reload only on every n-th invocation or iteration. E.g. +Pass `None` instead of an iterable to create an endless reloading loop, e.g. ```python -for i in reloading(range(1000), every=10): - # this code will only be reloaded before every 10th iteration - # this can help to speed-up tight loops - pass - -@reloading(every=10) -def some_function(): - # this code with only be reloaded before every 10th invocation - pass -``` - -Pass `forever=True` instead of an iterable to create an endless reloading loop, e.g. -```python -for i in reloading(forever=True): +for i in reloading(): # this code will loop forever and reload from source before each iteration pass ``` @@ -148,9 +135,10 @@ for epoch in reloading(range(NB_EPOCHS)): ``` [Here](https://github.com/julvo/reloading/blob/master/examples/tensorflow/train.py) is a full TensorFlow example. -## Testing +## Type Check and Testing -Make sure you have `python` and `python3` available in your path, then run: +Run: ``` -$ python3 reloading/test_reloading.py +$ pyright +$ python reloading/test_reloading.py ``` diff --git a/pyproject.toml b/pyproject.toml index c208c4e..bf83821 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,13 +5,13 @@ build-backend = "flit_core.buildapi" [project] name = "reloading" dependencies = [] -requires-python = ">=3.4" +requires-python = ">=3.8" authors = [{name = "Julian Vossen", email = "pypi@julianvossen.de"}] maintainers = [{name = "Eskild Schroll-Fleischer", email = "eyfl@novonordisk.com"}] -version="1.1.2" +version="1.2.0" license = {file = "LICENSE.txt"} readme = "README.md" -description = "Reloads source code of a running program without losing state" +description = "Reloads source code of a running program without losing state." keywords = ["reload", "reloading", "refresh", "loop", "decorator"] classifiers=[ "Development Status :: 3 - Alpha", @@ -19,16 +19,16 @@ classifiers=[ "Topic :: Utilities", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.4", - "Programming Language :: Python :: 3.5", - "Programming Language :: Python :: 3.6", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] [project.urls] -Repository = "https://github.com/julvo/reloading" +Repository = "https://github.com/eskildsf/reloading" [project.optional-dependencies] development = [ @@ -36,3 +36,10 @@ development = [ "pyright", "build", ] + +[tool.pyright] +include = ["reloading"] +exclude = [ + "**/__pycache__", + "examples", +] From ec3b4b2e454c63554b9f702caa548444c3f0551e Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Wed, 18 Dec 2024 14:36:37 +0100 Subject: [PATCH 14/65] Allow 'break' in loop. Allow 'continue' in loop. Support while loop. Support multiple uses of reloading in a single source code file. Add tests. Satisfy pyright. Satisfy flake8. Properly export local variables from loop. --- reloading/__init__.py | 2 +- reloading/reloading.py | 366 ++++++++++++++++++++++++--------- reloading/test_reloading.py | 397 +++++++++++++++++++++++++----------- 3 files changed, 551 insertions(+), 214 deletions(-) diff --git a/reloading/__init__.py b/reloading/__init__.py index f566150..d899ad5 100644 --- a/reloading/__init__.py +++ b/reloading/__init__.py @@ -1 +1 @@ -from .reloading import reloading as reloading +from .reloading import reloading as reloading # noqa diff --git a/reloading/reloading.py b/reloading/reloading.py index af785a6..1767b1d 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -2,12 +2,19 @@ import sys import ast import traceback -import types -from typing import Optional, Union, Callable, Iterable, Dict, Any, overload, Tuple, List +from typing import (Optional, + Union, + Callable, + Iterable, + Dict, + Any, + List, + overload) from itertools import chain from functools import partial, update_wrapper from copy import deepcopy + class NoIterPartial(partial): """ Make our own partial in case someone wants to use reloading as an @@ -22,16 +29,32 @@ def __iter__(self): "Nothing to iterate over. Please pass an iterable to reloading." ) + +@overload +def reloading(fn_or_seq_or_bool: Iterable) -> Iterable: ... + + +@overload +def reloading(fn_or_seq_or_bool: None) -> Iterable: ... + + @overload -def reloading(fn_or_seq: Iterable) -> Iterable: ... +def reloading(fn_or_seq_or_bool: bool) -> Iterable: ... + @overload -def reloading(fn_or_seq: None) -> Iterable: ... +def reloading() -> Iterable: ... + @overload -def reloading(fn_or_seq: Callable) -> Callable: ... +def reloading(fn_or_seq_or_bool: Callable) -> Callable: ... -def reloading(fn_or_seq: Optional[Union[Iterable, Callable]] = None) -> Union[Iterable, Callable]: + +def reloading(fn_or_seq_or_bool: Optional[ + Union[Iterable, + Callable, + bool]] = None) -> Union[Iterable, + Callable]: """ Wraps a loop iterator or decorates a function to reload the source code before every loop iteration or function invocation. @@ -39,22 +62,27 @@ def reloading(fn_or_seq: Optional[Union[Iterable, Callable]] = None) -> Union[It When wrapped around the outermost iterator in a `for` loop, e.g. `for i in reloading(range(10))`, causes the loop body to reload from source before every iteration while keeping the state. + When wrapped around the condition of a `while` loop, e.g. + `while reloading(i<10)`, causes the loop body and condition to reload from + source before every iteration while keeping the state. When used as a function decorator, the decorated function is reloaded from source before each execution. Args: - fn_or_seq (function | iterable): A function or loop iterator which should - be reloaded from source before each invocation or iteration, - respectively. + fn_or_seq_or_bool (function | iterable | bool): + A function, iterator or condition which should be reloaded from + source before each invocation or iteration, respectively. """ - if fn_or_seq: - if isinstance(fn_or_seq, Callable): - return _reloading_function(fn_or_seq) - elif isinstance(fn_or_seq, Iterable): - return _reloading_loop(fn_or_seq) + if fn_or_seq_or_bool: + if isinstance(fn_or_seq_or_bool, Callable): + return _reloading_function(fn_or_seq_or_bool) + elif (isinstance(fn_or_seq_or_bool, Iterable) or + isinstance(fn_or_seq_or_bool, bool)): + return _reloading_loop(fn_or_seq_or_bool) else: raise TypeError( - f"{reloading.__name__} expected function or iterable, got {type(fn_or_seq)}" + f"{reloading.__name__} expected function or iterable" + f", got {type(fn_or_seq_or_bool)}" ) else: return _reloading_loop(iter(int, 1)) @@ -72,7 +100,9 @@ def unique_name(seq: chain) -> str: return max(seq, key=len) + "0" -def format_iteration_variables(ast_node: Union[ast.Name, ast.Tuple, ast.List]) -> str: +def format_iteration_variables(ast_node: Union[ast.Name, + ast.Tuple, + ast.List, None]) -> str: """ Formats an `ast_node` of loop iteration variables as string. """ @@ -84,6 +114,9 @@ def format_iteration_variables(ast_node: Union[ast.Name, ast.Tuple, ast.List]) - # ast.Tuple/ast.List corresponds to multiple elements: # for i, j in zip(range(10), range(10)): # pass + if ast_node is None: + return '' + if isinstance(ast_node, ast.Name): return ast_node.id @@ -125,56 +158,90 @@ def parse_file_until_successful(filepath: str) -> ast.Module: source = load_file(filepath) -def isolate_loop_body_and_get_iteration_variables(reloaded_file_ast: ast.Module, - lineno: int, - loop_id: Union[None, str]) -> Tuple[ast.Module, ast.Name, str]: +class WhileLoop: + """ + Object to hold ast and test-function for a reloading while loop. + """ + def __init__(self, ast_module: ast.Module, test: ast.Call, id: str): + self.ast: ast.Module = ast_module + self.test: ast.Call = test + self.id: str = id + + +class ForLoop: + """ + Object to hold ast and iteration variables for a reloading for loop. + """ + def __init__(self, + ast_module: ast.Module, + iteration_variables: Union[ast.Name, + ast.Tuple, + ast.List], + id: str): + self.ast: ast.Module = ast_module + self.iteration_variables: Union[ast.Name, + ast.Tuple, + ast.List] = iteration_variables + self.iteration_variables_str: str = format_iteration_variables( + iteration_variables) + self.id: str = id + + +def get_loop_object(loop_frame_info: inspect.FrameInfo, + reloaded_file_ast: ast.Module, + loop_id: Union[None, str]) -> Union[WhileLoop, ForLoop]: """ Traverse AST for the entire reloaded file in a search for the loop which is reloaded. """ - candidate_nodes = [] + candidates = [] for node in ast.walk(reloaded_file_ast): if isinstance(node, ast.For) and isinstance(node.iter, ast.Call): if getattr(node.iter.func, "id") == "reloading" and ( - (loop_id is not None and loop_id == get_loop_id(node)) - or getattr(node, "lineno", None) == lineno): - candidate_nodes.append(node) - if len(candidate_nodes) > 1: - raise LookupError( - "The reloading loop is ambigious. Use `reloading` only once per line and make sure that the code in that line is unique within the source file." - ) - - if len(candidate_nodes) < 1: - raise LookupError( - "Could not locate reloading loop. Please make sure the code in the line that uses `reloading` doesn't change between reloads." - ) - - loop_node = candidate_nodes[0] - for_loop_ast = deepcopy(reloaded_file_ast) # Use reloaded_file_ast as template. - for_loop_ast.body = loop_node.body - return for_loop_ast, loop_node.target, get_loop_id(loop_node) - - -def get_loop_id(ast_node: ast.For) -> str: + (loop_id is not None and loop_id == get_loop_id(node)) + or getattr(node, "lineno", None) == loop_frame_info.lineno): + candidates.append(node) + if isinstance(node, ast.While) and isinstance(node.test, ast.Call): + if getattr(node.test.func, "id") == "reloading" and ( + (loop_id is not None and loop_id == get_loop_id(node)) + or getattr(node, "lineno", None) == loop_frame_info.lineno): + candidates.append(node) + + # Select the candidate node which is closest to function_frame_info + def sorting_function(candidate): + return abs(candidate.lineno - loop_frame_info.lineno) + candidate = min(candidates, key=sorting_function) + # Use reloaded_file_ast as template. + loop_node_ast = deepcopy(reloaded_file_ast) + loop_node_ast.body = candidate.body + if isinstance(candidate, ast.For): + assert isinstance(candidate.target, (ast.Name, ast.Tuple, ast.List)) + return ForLoop(loop_node_ast, candidate.target, get_loop_id(candidate)) + elif isinstance(candidate, ast.While): + assert isinstance(candidate.test, ast.Call) + return WhileLoop(loop_node_ast, candidate.test, get_loop_id(candidate)) + raise Exception("Unable to find reloading loop node.") + + +def get_loop_id(ast_node: Union[ast.For, ast.While]) -> str: """ Generates a unique identifier for an `ast_node`. Used to identify the loop in the changed source file. """ - return ast.dump(ast_node.target) + "__" + ast.dump(ast_node.iter) + if isinstance(ast_node, ast.For): + return ast.dump(ast_node.target) + "__" + ast.dump(ast_node.iter) + elif isinstance(ast_node, ast.While): + return ast.dump(ast_node.test) -def get_loop_code(loop_frame_info: inspect.FrameInfo, loop_id: Union[None, str]) -> Tuple[ast.Module, str, str]: +def get_loop_code(loop_frame_info: inspect.FrameInfo, + loop_id: Union[None, str]) -> Union[WhileLoop, ForLoop]: filepath: str = loop_frame_info.filename while True: reloaded_file_ast: ast.Module = parse_file_until_successful(filepath) try: - for_loop_ast, iteration_variables, found_loop_id = isolate_loop_body_and_get_iteration_variables( - reloaded_file_ast, lineno=loop_frame_info.lineno, loop_id=loop_id - ) - return ( - for_loop_ast, - format_iteration_variables(iteration_variables), - found_loop_id, + return get_loop_object( + loop_frame_info, reloaded_file_ast, loop_id=loop_id ) except LookupError: handle_exception(filepath) @@ -190,7 +257,8 @@ def handle_exception(filepath: str): if sys.stdin.isatty(): print( - f"An error occurred. Please edit the file '{filepath}' to fix the issue and press return to continue or Ctrl+C to exit." + f"An error occurred. Please edit the file '{filepath}' to fix" + "the issue and press return to continue or Ctrl+C to exit." ) try: sys.stdin.readline() @@ -202,48 +270,131 @@ def handle_exception(filepath: str): line_number = int(exception.split(", line ")[-1].split(",")[0]) print(line_number) raise Exception( - f"An error occurred. Please fix the issue in the file '{filepath}' and run the script again." + "An error occurred. Please fix the issue in the file" + f"'{filepath}' and run the script again." ) -def _reloading_loop(seq: Iterable) -> Iterable: - stack: List[inspect.FrameInfo] = inspect.stack() - # The first element on the stack is the caller of inspect.stack() i.e. _reloading_loop - assert stack[0].function == '_reloading_loop' - # The second element is the caller of the first, i.e. reloading - assert stack[1].function == 'reloading' - # The third element is the loop which called reloading. - loop_frame_info: inspect.FrameInfo = stack[2] - filepath: str = loop_frame_info.filename +def execute_iteration(loop_body_ast: ast.Module, + caller_globals, + caller_locals): + # Replace "break" and "continue" with custom exceptions. + # Otherwise SyntaxError is raised because these instructions + # are called outside a loop. + code = ast.unparse(loop_body_ast) + code = code.replace("break", "raise Exception('break')") + code = code.replace("continue", "raise Exception('continue')") + # Run loop body + compiled_body = compile(code, filename="", mode="exec") + exec(compiled_body, caller_globals, caller_locals) + +def execute_for_loop(seq: Iterable, loop_frame_info: inspect.FrameInfo): + filepath = loop_frame_info.filename caller_globals: Dict[str, Any] = loop_frame_info.frame.f_globals caller_locals: Dict[str, Any] = loop_frame_info.frame.f_locals + for_loop = get_loop_code( + loop_frame_info, loop_id=None + ) + # Make up a name for a variable which is not already present in the global # or local namespace. vacant_variable_name: str = unique_name(chain(caller_locals.keys(), caller_globals.keys())) - loop_id = None - - for_loop_ast, iteration_variables, loop_id = get_loop_code( - loop_frame_info, loop_id=loop_id - ) for i, iteration_variable_values in enumerate(seq): # Reload code - for_loop_ast, iteration_variables, loop_id = get_loop_code( - loop_frame_info, loop_id=loop_id + for_loop = get_loop_code( + loop_frame_info, loop_id=for_loop.id ) + assert isinstance(for_loop, ForLoop) # Store iteration variable values in vacant variable in local scope caller_locals[vacant_variable_name] = iteration_variable_values # Reassign variable values from vacant variable in local scope - exec(iteration_variables + " = " + vacant_variable_name, caller_globals, caller_locals) + exec(for_loop.iteration_variables_str + " = " + vacant_variable_name, + caller_globals, caller_locals) try: - # Run loop body - compiled_body = compile(for_loop_ast, filename="", mode="exec") - exec(compiled_body, caller_globals, caller_locals) - except Exception: - handle_exception(filepath) + execute_iteration(for_loop.ast, caller_globals, caller_locals) + except Exception as exception: + # A "break" inside the loop body will cause a SyntaxError + # because the code is executed outside the scope of a loop. + # We catch the exception and break *this* loop. + if exception.args == ("break",): + break + if exception.args == ("continue",): + continue + else: + handle_exception(filepath) + + +def execute_while_loop(loop_frame_info: inspect.FrameInfo): + filepath = loop_frame_info.filename + caller_globals: Dict[str, Any] = loop_frame_info.frame.f_globals + caller_locals: Dict[str, Any] = loop_frame_info.frame.f_locals + + while_loop = get_loop_code( + loop_frame_info, loop_id=None + ) + # Make up a name for a variable which is not already present in the global + # or local namespace. + vacant_variable_name: str = unique_name(chain(caller_locals.keys(), + caller_globals.keys())) + + def condition(while_loop): + test = ast.unparse(while_loop.test).replace("reloading", "") + exec(vacant_variable_name+" = "+test, caller_globals, caller_locals) + result = deepcopy(caller_locals[vacant_variable_name]) + del caller_locals[vacant_variable_name] + return result + + i = 0 + while condition(while_loop): + i += 1 + # Reload code + while_loop = get_loop_code( + loop_frame_info, loop_id=while_loop.id + ) + try: + execute_iteration(while_loop.ast, caller_globals, caller_locals) + except Exception as exception: + # A "break" inside the loop body will cause a SyntaxError + # because the code is executed outside the scope of a loop. + # We catch the exception and break *this* loop. + if exception.args == ("break",): + break + if exception.args == ("continue",): + continue + else: + handle_exception(filepath) + + +def _reloading_loop(seq: Union[Iterable, bool]) -> Iterable: + stack: List[inspect.FrameInfo] = inspect.stack() + # The first element on the stack is the caller of inspect.stack() + # i.e. _reloading_loop + assert stack[0].function == '_reloading_loop' + # The second element is the caller of the first, i.e. reloading + assert stack[1].function == 'reloading' + # The third element is the loop which called reloading. + loop_frame_info: inspect.FrameInfo = stack[2] + loop_object = get_loop_code( + loop_frame_info, loop_id=None + ) + if isinstance(loop_object, ForLoop): + assert isinstance(seq, Iterable) + execute_for_loop(seq, loop_frame_info) + elif isinstance(loop_object, WhileLoop): + execute_while_loop(loop_frame_info) + # If there is a third element, then it is the scope which called the loop. + if len(stack) > 3: + # Copy locals from loop to caller of loop. + # This ensures that the following results in '9': + # for i in reloading(range(10)): + # pass + # print(i) + loop_caller_frame: inspect.FrameInfo = stack[3] + loop_caller_frame.frame.f_locals.update(loop_frame_info.frame.f_locals) return [] @@ -262,63 +413,81 @@ def strip_reloading_decorator(function_with_decorator: ast.FunctionDef): """ Remove the 'reloading' decorator and all decorators before it. """ + # Create shorthand for readability + fwd = function_with_decorator # Find decorators - decorator_names = [get_decorator_name_or_none(dec) for dec in function_with_decorator.decorator_list] + decorator_names = [get_decorator_name_or_none(decorator) + for decorator + in fwd.decorator_list] # Find index of "reloading" decorator reloading_index = decorator_names.index("reloading") - function_without_decorator = deepcopy(function_with_decorator) # Use function with decorator as template - function_without_decorator.decorator_list = function_with_decorator.decorator_list[reloading_index + 1:] + # Use function with decorator as template + fwod = deepcopy(fwd) + fwod.decorator_list = fwd.decorator_list[reloading_index + 1:] + function_without_decorator = fwod return function_without_decorator -def isolate_function_def(qualname: str, function: Callable, reloaded_file_ast: ast.Module) -> Union[None, ast.Module]: +def isolate_function_def(function_frame_info: inspect.FrameInfo, + function: Callable, + reloaded_file_ast: ast.Module) -> Union[None, + ast.Module]: """ Traverse AST for the entire reloaded file in a search for the function (minus the reloading decorator) which is reloaded. """ + qualname = function.__qualname__ length = len(qualname.split(".")) function_name = qualname.split(".")[-1] class_name = qualname.split(".")[length - 2] if length > 1 else None + candidates = [] for node in ast.walk(reloaded_file_ast): if isinstance(node, ast.ClassDef) and node.name == class_name: for subnode in node.body: - if isinstance(subnode, ast.FunctionDef) and subnode.name == function_name: + if (isinstance(subnode, ast.FunctionDef) and + subnode.name == function_name): if "reloading" in [ get_decorator_name_or_none(decorator) for decorator in subnode.decorator_list ]: - function_node = strip_reloading_decorator(subnode) - function_node_ast = deepcopy(reloaded_file_ast) # Use reloaded_file_ast as template. - function_node_ast.body = [function_node] - return function_node_ast + candidates.append(subnode) if isinstance(node, ast.FunctionDef) and node.name == function_name: if "reloading" in [ get_decorator_name_or_none(decorator) for decorator in node.decorator_list ]: - function_node = strip_reloading_decorator(node) - function_node_ast = deepcopy(reloaded_file_ast) # Use reloaded_file_ast as template. - function_node_ast.body = [ function_node ] - return function_node_ast + candidates.append(node) + # Select the candidate node which is closest to function_frame_info + if len(candidates): + def sorting_function(candidate): + return abs(candidate.lineno - function_frame_info.lineno) + candidate = min(candidates, key=sorting_function) + function_node = strip_reloading_decorator(candidate) + function_node_ast = deepcopy(reloaded_file_ast) + function_node_ast.body = [function_node] + return function_node_ast return None -def get_function_def_code(filepath: str, function: Callable) -> Union[None, ast.Module]: - reloaded_file_ast: ast.Module = parse_file_until_successful(filepath) - function_ast = isolate_function_def(function.__qualname__, function, reloaded_file_ast) - return function_ast +def get_function_def_code(function_frame_info: inspect.FrameInfo, + function: Callable) -> Union[None, ast.Module]: + reloaded_file_ast: ast.Module = parse_file_until_successful( + function_frame_info.filename) + return isolate_function_def(function_frame_info, + function, + reloaded_file_ast) def get_reloaded_function(caller_globals: Dict[str, Any], caller_locals: Dict[str, Any], - filepath: str, + function_frame_info: inspect.FrameInfo, function: Callable) -> Union[None, Callable]: - function_ast = get_function_def_code(filepath, function) + function_ast = get_function_def_code(function_frame_info, function) if function_ast is None: return None - # need to copy locals, otherwise the exec will overwrite the decorated with the undecorated new version - # this became a need after removing the reloading decorator from the newly defined version + # Copy locals to avoid exec overwriting the decorated function with the new + # undecorated function. caller_locals_copy = caller_locals.copy() compiled_body = compile(function_ast, filename="", mode="exec") exec(compiled_body, caller_globals, caller_locals_copy) @@ -328,7 +497,8 @@ def get_reloaded_function(caller_globals: Dict[str, Any], def _reloading_function(function: Callable) -> Callable: stack: List[inspect.FrameInfo] = inspect.stack() - # The first element on the stack is the caller of inspect.stack() i.e. _reloading_function + # The first element on the stack is the caller of inspect.stack() + # That is, this very function. assert stack[0].function == '_reloading_function' # The second element is the caller of the first, i.e. reloading assert stack[1].function == 'reloading' @@ -348,7 +518,7 @@ def wrapped(*args, **kwargs): state["function"] = ( get_reloaded_function(caller_globals, caller_locals, - filepath, + function_frame_info, function) or state["function"] ) @@ -362,11 +532,11 @@ def wrapped(*args, **kwargs): state["func"] = ( get_reloaded_function(caller_globals, caller_locals, - filepath, + function_frame_info, function) or state["function"] ) - wrapped.__signature__ = inspect.signature(function) # type: ignore + wrapped.__signature__ = inspect.signature(function) # type: ignore caller_locals[function.__name__] = wrapped return wrapped diff --git a/reloading/test_reloading.py b/reloading/test_reloading.py index 2151e37..c9d2393 100644 --- a/reloading/test_reloading.py +++ b/reloading/test_reloading.py @@ -7,16 +7,164 @@ SRC_FILE_NAME = "temporary_testing_file.py" -TEST_CHANGING_SOURCE_LOOP_CONTENT = """ + +def run_and_update_source(init_src, updated_src=None, update_after=0.5): + """Runs init_src in a subprocess and updates source to updated_src after + update_after seconds. Returns the standard output of the subprocess and + whether the subprocess produced an uncaught exception. + """ + with open(SRC_FILE_NAME, "w") as f: + f.write(init_src) + + cmd = ["python", SRC_FILE_NAME] + with sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE) as proc: + if updated_src is not None: + time.sleep(update_after) + with open(SRC_FILE_NAME, "w") as f: + f.write(updated_src) + + try: + stdout, _ = proc.communicate(timeout=2) + stdout = stdout.decode("utf-8") + has_error = False + except Exception: + stdout = "" + has_error = True + proc.terminate() + + if os.path.isfile(SRC_FILE_NAME): + os.remove(SRC_FILE_NAME) + + return stdout, has_error + + +class TestReloadingForLoopWithoutChanges(unittest.TestCase): + def test_no_argument(self): + i = 0 + for _ in reloading(): + i += 1 + if i > 10: + break + + self.assertEqual(i, 11) + + def test_range_pass(self): + for _ in reloading(range(10)): + pass + + def test_range_body(self): + i = 0 + for _ in reloading(range(10)): + i += 1 + + self.assertEqual(i, 10) + + def test_complex_iteration_variables(self): + i = 0 + j = 0 + for j, (a, b) in reloading(enumerate(zip(range(10), range(10)))): + i += 1 + + self.assertEqual(i, 10) + self.assertEqual(j, 9) + + +class TestReloadingWhileLoopWithoutChanges(unittest.TestCase): + def test_false(self): + i = 0 + while reloading(False): + i += 1 + + self.assertEqual(i, 0) + + def test_true_break(self): + i = 0 + while reloading(True): + i += 1 + if i > 9: + break + + self.assertEqual(i, 10) + + def test_condition_changes(self): + i = 0 + + def condition(): # type: ignore + return True + + while reloading(condition()): + i += 1 + if i > 9: + def condition(): + return False + + self.assertEqual(i, 10) + + def test_condition(self): + i = 0 + while i < 10: + i += 1 + + self.assertEqual(i, 10) + + +class TestReloadingFunctionWithoutChanges(unittest.TestCase): + def test_empty_function_definition(self): + @reloading + def function(): + pass + + def test_empty_function_run(self): + @reloading + def function(): + pass + + function() + + def test_function_return_value(self): + @reloading + def function(): + return "result" + + self.assertTrue(function() == "result") + + def test_nested_function(self): + def outer(): + @reloading + def inner(): + return "result" + return inner() + + self.assertTrue(outer() == "result") + + def test_function_signature_is_preserved(self): + @reloading + def some_func(a, b, c): + return "result" + + import inspect + self.assertTrue(str(inspect.signature(some_func)) == "(a, b, c)") + + +class TestReloadingForLoopWithChanges(unittest.TestCase): + def test_changing_source_loop(self): + code = """ from reloading import reloading from time import sleep -for epoch, ep in reloading(zip(range(10), range(1,11))): +for epoch1, epoch2 in reloading(zip(range(10), range(1,11))): sleep(0.2) print('INITIAL_FILE_CONTENTS') """ + stdout, _ = run_and_update_source( + init_src=code, + updated_src=code.replace("INITIAL", "CHANGED"), + ) + self.assertIn("INITIAL_FILE_CONTENTS", stdout) + self.assertIn("CHANGED_FILE_CONTENTS", stdout) -TEST_CHANGING_LINE_NUMBER_OF_LOOP = """ + def test_changing_line_number_of_loop(self): + code = """ from reloading import reloading from time import sleep @@ -26,30 +174,35 @@ sleep(0.2) print('INITIAL_FILE_CONTENTS') """ + stdout, _ = run_and_update_source( + init_src=code, + updated_src=code.replace("pass", "pass\npass\n"). + replace("INITIAL", "CHANGED"), + ) + self.assertIn("INITIAL_FILE_CONTENTS", stdout) + self.assertIn("CHANGED_FILE_CONTENTS", stdout) -TEST_CHANGING_SOURCE_FN_CONTENT = """ + def test_keep_local_variables(self): + code = """ from reloading import reloading from time import sleep -@reloading -def reload_this_fn(): - print('INITIAL_FILE_CONTENTS') - +text = "DON'T CHANGE ME" for epoch in reloading(range(10)): sleep(0.2) - reload_this_fn() -""" - -TEST_KEEP_LOCAL_VARIABLES_CONTENT = """ -from reloading import reloading -from time import sleep - -fpath = "DON'T CHANGE ME" -for epoch in reloading(range(1)): - assert fpath == "DON'T CHANGE ME" + print('INITIAL_FILE_CONTENTS') + assert text == "DON'T CHANGE ME" """ + stdout, has_error = run_and_update_source( + init_src=code, + updated_src=code.replace("INITIAL", "CHANGED") + ) + self.assertFalse(has_error) + self.assertIn("INITIAL_FILE_CONTENTS", stdout) + self.assertIn("CHANGED_FILE_CONTENTS", stdout) -TEST_PERSIST_AFTER_LOOP = """ + def test_persist_after_loop(self): + code = """ from reloading import reloading from time import sleep @@ -59,8 +212,11 @@ def reload_this_fn(): assert state == 'CHANGED' """ + _, has_error = run_and_update_source(init_src=code) + self.assertFalse(has_error) -TEST_COMMENT_AFTER_LOOP_CONTENT = """ + def test_comment_after_loop(self): + code = """ from reloading import reloading from time import sleep @@ -70,8 +226,16 @@ def reload_this_fn(): # a comment here should not cause an error """ + stdout, _ = run_and_update_source( + init_src=code, + updated_src=code.replace("INITIAL", "CHANGED"), + ) + + self.assertIn("INITIAL_FILE_CONTENTS", stdout) + self.assertIn("CHANGED_FILE_CONTENTS", stdout) -TEST_FORMAT_STR_IN_LOOP_CONTENT = """ + def test_format_str_in_loop(self): + code = """ from reloading import reloading from time import sleep @@ -80,132 +244,135 @@ def reload_this_fn(): file_contents = 'FILE_CONTENTS' print(f'INITIAL_{file_contents}') """ + stdout, _ = run_and_update_source( + init_src=code, + updated_src=code.replace("INITIAL", "CHANGED").rstrip("\n"), + ) + + self.assertIn("INITIAL_FILE_CONTENTS", stdout) + self.assertIn("CHANGED_FILE_CONTENTS", stdout) -TEST_FUNCTION_AFTER = """ + def test_unicode(self): + code = """ from reloading import reloading from time import sleep -@reloading -def some_func(a, b): +for epoch, ep in reloading(zip(range(10), range(1,11))): sleep(0.2) - print(a+b) - -for _ in range(10): - some_func(2,1) + print('INITIAL_FILE_CONTENTS'+'😊') """ + stdout, _ = run_and_update_source( + init_src=code, + updated_src=code.replace("INITIAL", "CHANGED"), + ) + self.assertIn("INITIAL_FILE_CONTENTS", stdout) + self.assertIn("CHANGED_FILE_CONTENTS", stdout) -def run_and_update_source(init_src, updated_src=None, update_after=0.5): - """Runs init_src in a subprocess and updates source to updated_src after - update_after seconds. Returns the standard output of the subprocess and - whether the subprocess produced an uncaught exception. - """ - with open(SRC_FILE_NAME, "w") as f: - f.write(init_src) - - cmd = ["python", SRC_FILE_NAME] - with sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE) as proc: - if updated_src is not None: - time.sleep(update_after) - with open(SRC_FILE_NAME, "w") as f: - f.write(updated_src) - - try: - stdout, _ = proc.communicate(timeout=2) - stdout = stdout.decode("utf-8") - has_error = False - except Exception: - stdout = "" - has_error = True - proc.terminate() - - if os.path.isfile(SRC_FILE_NAME): - os.remove(SRC_FILE_NAME) + def test_nested_loop(self): + code = """ +from reloading import reloading +from time import sleep - return stdout, has_error +for i in range(1): + static = 'A' + for j in reloading(range(10, 20)): + dynamic = 'B' + print(static+dynamic) + sleep(0.2) +""" + stdout, _ = run_and_update_source( + init_src=code, + updated_src=code.replace("dynamic = 'B'", "dynamic = 'C'"). + replace("static = 'A'", "static = 'D'"), + ) + self.assertTrue("AB" in stdout and "AC" in stdout) -class TestReloading(unittest.TestCase): - def test_simple_looping(self): - iters = 0 - for _ in reloading(range(10)): - iters += 1 +class TestReloadingWhileLoopWithChanges(unittest.TestCase): def test_changing_source_loop(self): - stdout, _ = run_and_update_source( - init_src=TEST_CHANGING_SOURCE_LOOP_CONTENT, - updated_src=TEST_CHANGING_SOURCE_LOOP_CONTENT.replace("INITIAL", "CHANGED").rstrip("\n"), - ) - print(stdout) - self.assertTrue("INITIAL_FILE_CONTENTS" in stdout and "CHANGED_FILE_CONTENTS" in stdout) + code = """ +from reloading import reloading +from time import sleep - def test_changing_line_number_of_loop(self): +i = 0 +while reloading(i < 100): + sleep(0.2) + print(i) + i += 1 +""" stdout, _ = run_and_update_source( - init_src=TEST_CHANGING_LINE_NUMBER_OF_LOOP, - updated_src=( - TEST_CHANGING_LINE_NUMBER_OF_LOOP - .replace("pass", "pass\npass\n") - .replace("INITIAL", "CHANGED") - .rstrip("\n") - ), + init_src=code, + updated_src=code.replace("i < 100", "i < 10"), ) - print(stdout) - self.assertTrue("INITIAL_FILE_CONTENTS" in stdout and "CHANGED_FILE_CONTENTS" in stdout) + max_i = stdout.strip().split("\n")[-1] + self.assertEqual(max_i, "9") - def test_comment_after_loop(self): - stdout, _ = run_and_update_source( - init_src=TEST_COMMENT_AFTER_LOOP_CONTENT, - updated_src=TEST_COMMENT_AFTER_LOOP_CONTENT.replace("INITIAL", "CHANGED").rstrip("\n"), - ) - self.assertTrue("INITIAL_FILE_CONTENTS" in stdout and "CHANGED_FILE_CONTENTS" in stdout) +class TestReloadingFunctionsWithChanges(unittest.TestCase): + def test_changing_source_function(self): + code = """ +from reloading import reloading +from time import sleep - def test_format_str_in_loop(self): +@reloading +def reload_this_fn(): + print('INITIAL_FILE_CONTENTS') + +for epoch in reloading(range(10)): + sleep(0.2) + reload_this_fn() +""" stdout, _ = run_and_update_source( - init_src=TEST_FORMAT_STR_IN_LOOP_CONTENT, - updated_src=TEST_FORMAT_STR_IN_LOOP_CONTENT.replace("INITIAL", "CHANGED").rstrip("\n"), + init_src=code, + updated_src=code.replace("INITIAL", "CHANGED"), ) + self.assertIn("INITIAL_FILE_CONTENTS", stdout) + self.assertIn("CHANGED_FILE_CONTENTS", stdout) - self.assertTrue("INITIAL_FILE_CONTENTS" in stdout and "CHANGED_FILE_CONTENTS" in stdout) - - def test_keep_local_variables(self): - _, has_error = run_and_update_source(init_src=TEST_KEEP_LOCAL_VARIABLES_CONTENT) - self.assertFalse(has_error) - - def test_persist_after_loop(self): - _, has_error = run_and_update_source(init_src=TEST_PERSIST_AFTER_LOOP) - self.assertFalse(has_error) - - def test_simple_function(self): - @reloading - def some_func(): - return "result" + def test_reloading_function(self): + code = """ +from reloading import reloading +from time import sleep - self.assertTrue(some_func() == "result") +@reloading +def some_func(a, b): + sleep(0.2) + print(a+b) - def test_reloading_function(self): +for _ in range(10): + some_func(2,1) +""" stdout, _ = run_and_update_source( - init_src=TEST_FUNCTION_AFTER, - updated_src=TEST_FUNCTION_AFTER.replace("a+b", "a-b"), + init_src=code, + updated_src=code.replace("a+b", "a-b"), ) self.assertTrue("3" in stdout and "1" in stdout) - def test_function_signature_is_preserved(self): - import inspect - - @reloading - def some_func(a, b, c): - return "result" + def test_nested_function(self): + code = """ +from reloading import reloading +from time import sleep - self.assertTrue(str(inspect.signature(some_func)) == "(a, b, c)") +def outer(): + static = 'A' + @reloading + def inner(x): + dynamic = 'B' + return x + dynamic + return inner(static) - def test_changing_source_function(self): +for i in range(10): + print(outer()) + sleep(0.2) +""" stdout, _ = run_and_update_source( - init_src=TEST_CHANGING_SOURCE_FN_CONTENT, - updated_src=TEST_CHANGING_SOURCE_FN_CONTENT.replace("INITIAL", "CHANGED").rstrip("\n"), + init_src=code, + updated_src=code.replace("dynamic = 'B'", "dynamic = 'C'"). + replace("static = 'D'", "static = 'D'"), ) - print(stdout) - self.assertTrue("INITIAL_FILE_CONTENTS" in stdout and "CHANGED_FILE_CONTENTS" in stdout) + self.assertTrue("AB" in stdout and "AC" in stdout) if __name__ == "__main__": From b84a4b72de46a2e812f416ec1aaaf62e0b753ab5 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Wed, 18 Dec 2024 14:40:16 +0100 Subject: [PATCH 15/65] Drop support for Python 3.8 --- .github/workflows/python-testing.yml | 2 +- pyproject.toml | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/python-testing.yml b/.github/workflows/python-testing.yml index 4d152d7..459dfe5 100644 --- a/.github/workflows/python-testing.yml +++ b/.github/workflows/python-testing.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.8.18", "3.9.20", "3.10.15", "3.11.11", "3.12.8", "3.13.1"] + python-version: ["3.9.20", "3.10.15", "3.11.11", "3.12.8", "3.13.1"] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} diff --git a/pyproject.toml b/pyproject.toml index bf83821..83b2214 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ build-backend = "flit_core.buildapi" [project] name = "reloading" dependencies = [] -requires-python = ">=3.8" +requires-python = ">=3.9" authors = [{name = "Julian Vossen", email = "pypi@julianvossen.de"}] maintainers = [{name = "Eskild Schroll-Fleischer", email = "eyfl@novonordisk.com"}] version="1.2.0" @@ -19,7 +19,6 @@ classifiers=[ "Topic :: Utilities", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", From a28ad6abddbdcbc9cabb51a3c8fbe56e1038dc95 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Wed, 18 Dec 2024 22:34:12 +0100 Subject: [PATCH 16/65] Add logging. Fix tests on Python versions < 3.13. Improve tests. --- reloading/reloading.py | 148 ++++++++++++++++++++++-------------- reloading/test_reloading.py | 42 ++++++---- 2 files changed, 119 insertions(+), 71 deletions(-) diff --git a/reloading/reloading.py b/reloading/reloading.py index 1767b1d..dc3e93f 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -1,5 +1,6 @@ import inspect import sys +import os import ast import traceback from typing import (Optional, @@ -13,6 +14,10 @@ from itertools import chain from functools import partial, update_wrapper from copy import deepcopy +import logging + +log = logging.getLogger("reloading") +logging.basicConfig(level=logging.INFO) class NoIterPartial(partial): @@ -81,8 +86,8 @@ def reloading(fn_or_seq_or_bool: Optional[ return _reloading_loop(fn_or_seq_or_bool) else: raise TypeError( - f"{reloading.__name__} expected function or iterable" - f", got {type(fn_or_seq_or_bool)}" + f'{reloading.__name__} expected function or iterable' + f', got "{type(fn_or_seq_or_bool)}"' ) else: return _reloading_loop(iter(int, 1)) @@ -115,7 +120,7 @@ def format_iteration_variables(ast_node: Union[ast.Name, # for i, j in zip(range(10), range(10)): # pass if ast_node is None: - return '' + return "" if isinstance(ast_node, ast.Name): return ast_node.id @@ -166,6 +171,14 @@ def __init__(self, ast_module: ast.Module, test: ast.Call, id: str): self.ast: ast.Module = ast_module self.test: ast.Call = test self.id: str = id + # Replace "break" and "continue" with custom exceptions. + # Otherwise SyntaxError is raised because these instructions + # are called outside a loop. + code = ast.unparse(ast_module) + code = code.replace("break", "raise Exception('break')") + code = code.replace("continue", "raise Exception('continue')") + # Compile loop body + self.compiled_body = compile(code, filename="", mode="exec") class ForLoop: @@ -185,6 +198,14 @@ def __init__(self, self.iteration_variables_str: str = format_iteration_variables( iteration_variables) self.id: str = id + # Replace "break" and "continue" with custom exceptions. + # Otherwise SyntaxError is raised because these instructions + # are called outside a loop. + code = ast.unparse(ast_module) + code = code.replace("break", "raise Exception('break')") + code = code.replace("continue", "raise Exception('continue')") + # Compile loop body + self.compiled_body = compile(code, filename="", mode="exec") def get_loop_object(loop_frame_info: inspect.FrameInfo, @@ -270,51 +291,44 @@ def handle_exception(filepath: str): line_number = int(exception.split(", line ")[-1].split(",")[0]) print(line_number) raise Exception( - "An error occurred. Please fix the issue in the file" - f"'{filepath}' and run the script again." + 'An error occurred. Please fix the issue in the file' + f'"{filepath}" and run the script again.' ) -def execute_iteration(loop_body_ast: ast.Module, - caller_globals, - caller_locals): - # Replace "break" and "continue" with custom exceptions. - # Otherwise SyntaxError is raised because these instructions - # are called outside a loop. - code = ast.unparse(loop_body_ast) - code = code.replace("break", "raise Exception('break')") - code = code.replace("continue", "raise Exception('continue')") - # Run loop body - compiled_body = compile(code, filename="", mode="exec") - exec(compiled_body, caller_globals, caller_locals) - - def execute_for_loop(seq: Iterable, loop_frame_info: inspect.FrameInfo): filepath = loop_frame_info.filename caller_globals: Dict[str, Any] = loop_frame_info.frame.f_globals caller_locals: Dict[str, Any] = loop_frame_info.frame.f_locals + file_stat: int = os.stat(filepath).st_mtime_ns for_loop = get_loop_code( loop_frame_info, loop_id=None ) - # Make up a name for a variable which is not already present in the global - # or local namespace. - vacant_variable_name: str = unique_name(chain(caller_locals.keys(), - caller_globals.keys())) for i, iteration_variable_values in enumerate(seq): - # Reload code - for_loop = get_loop_code( - loop_frame_info, loop_id=for_loop.id - ) + # Reload code if possibly modified + if file_stat != os.stat(filepath).st_mtime_ns: + log.info(f'For loop at line {loop_frame_info.lineno} of file ' + f'"{filepath}" has been reloaded.') + for_loop = get_loop_code( + loop_frame_info, loop_id=for_loop.id + ) + file_stat = os.stat(filepath).st_mtime_ns assert isinstance(for_loop, ForLoop) + # Make up a name for a variable which is not already present in + # the global or local namespace. + vacant_variable_name: str = unique_name(chain(caller_locals.keys(), + caller_globals.keys())) # Store iteration variable values in vacant variable in local scope caller_locals[vacant_variable_name] = iteration_variable_values # Reassign variable values from vacant variable in local scope exec(for_loop.iteration_variables_str + " = " + vacant_variable_name, caller_globals, caller_locals) + # Clean up namespace + del caller_locals[vacant_variable_name] try: - execute_iteration(for_loop.ast, caller_globals, caller_locals) + exec(for_loop.compiled_body, caller_globals, caller_locals) except Exception as exception: # A "break" inside the loop body will cause a SyntaxError # because the code is executed outside the scope of a loop. @@ -332,16 +346,17 @@ def execute_while_loop(loop_frame_info: inspect.FrameInfo): caller_globals: Dict[str, Any] = loop_frame_info.frame.f_globals caller_locals: Dict[str, Any] = loop_frame_info.frame.f_locals + file_stat: int = os.stat(filepath).st_mtime_ns while_loop = get_loop_code( loop_frame_info, loop_id=None ) - # Make up a name for a variable which is not already present in the global - # or local namespace. - vacant_variable_name: str = unique_name(chain(caller_locals.keys(), - caller_globals.keys())) def condition(while_loop): test = ast.unparse(while_loop.test).replace("reloading", "") + # Make up a name for a variable which is not already present in + # the global or local namespace. + vacant_variable_name: str = unique_name(chain(caller_locals.keys(), + caller_globals.keys())) exec(vacant_variable_name+" = "+test, caller_globals, caller_locals) result = deepcopy(caller_locals[vacant_variable_name]) del caller_locals[vacant_variable_name] @@ -350,12 +365,16 @@ def condition(while_loop): i = 0 while condition(while_loop): i += 1 - # Reload code - while_loop = get_loop_code( - loop_frame_info, loop_id=while_loop.id - ) + # Reload code if possibly modified + if file_stat != os.stat(filepath).st_mtime_ns: + log.info(f'While loop at line {loop_frame_info.lineno} of file ' + f'"{filepath}" has been reloaded.') + while_loop = get_loop_code( + loop_frame_info, loop_id=while_loop.id + ) + file_stat = os.stat(filepath).st_mtime_ns try: - execute_iteration(while_loop.ast, caller_globals, caller_locals) + exec(while_loop.compiled_body, caller_globals, caller_locals) except Exception as exception: # A "break" inside the loop body will cause a SyntaxError # because the code is executed outside the scope of a loop. @@ -372,9 +391,9 @@ def _reloading_loop(seq: Union[Iterable, bool]) -> Iterable: stack: List[inspect.FrameInfo] = inspect.stack() # The first element on the stack is the caller of inspect.stack() # i.e. _reloading_loop - assert stack[0].function == '_reloading_loop' + assert stack[0].function == "_reloading_loop" # The second element is the caller of the first, i.e. reloading - assert stack[1].function == 'reloading' + assert stack[1].function == "reloading" # The third element is the loop which called reloading. loop_frame_info: inspect.FrameInfo = stack[2] loop_object = get_loop_code( @@ -387,7 +406,10 @@ def _reloading_loop(seq: Union[Iterable, bool]) -> Iterable: elif isinstance(loop_object, WhileLoop): execute_while_loop(loop_frame_info) # If there is a third element, then it is the scope which called the loop. - if len(stack) > 3: + # It is only possible to modify variables in this scope since Python 3.13. + if (len(stack) > 3 and + sys.version_info.major >= 3 and + sys.version_info.minor >= 13): # Copy locals from loop to caller of loop. # This ensures that the following results in '9': # for i in reloading(range(10)): @@ -395,6 +417,13 @@ def _reloading_loop(seq: Union[Iterable, bool]) -> Iterable: # print(i) loop_caller_frame: inspect.FrameInfo = stack[3] loop_caller_frame.frame.f_locals.update(loop_frame_info.frame.f_locals) + else: + variables = ", ".join( + f'"{k}"' for k in loop_frame_info.frame.f_locals.keys()) + log.warning(f"Variable(s) {variables} in reloaded loop were not " + "exported to the scope which called the reloaded loop at " + f'line {loop_frame_info.lineno} in file ' + f'"{loop_frame_info.filename}".') return [] @@ -499,29 +528,41 @@ def _reloading_function(function: Callable) -> Callable: stack: List[inspect.FrameInfo] = inspect.stack() # The first element on the stack is the caller of inspect.stack() # That is, this very function. - assert stack[0].function == '_reloading_function' + assert stack[0].function == "_reloading_function" # The second element is the caller of the first, i.e. reloading - assert stack[1].function == 'reloading' + assert stack[1].function == "reloading" # The third element is the loop which called reloading. function_frame_info: inspect.FrameInfo = stack[2] filepath: str = function_frame_info.filename caller_globals = function_frame_info.frame.f_globals caller_locals = function_frame_info.frame.f_locals + + file_stat: int = os.stat(filepath).st_mtime_ns + # crutch to use dict as python2 doesn't support nonlocal state = { - "function": function, + "function": get_reloaded_function(caller_globals, + caller_locals, + function_frame_info, + function), "reloads": 0, } def wrapped(*args, **kwargs): - state["function"] = ( - get_reloaded_function(caller_globals, - caller_locals, - function_frame_info, - function) - or state["function"] - ) + nonlocal file_stat + # Reload code if possibly modified + if file_stat != os.stat(filepath).st_mtime_ns: + log.info(f'Function at line {function_frame_info.lineno} ' + f'of file "{filepath}" has been reloaded.') + state["function"] = ( + get_reloaded_function(caller_globals, + caller_locals, + function_frame_info, + function) + or state["function"] + ) + file_stat = os.stat(filepath).st_mtime_ns state["reloads"] += 1 while True: try: @@ -529,13 +570,6 @@ def wrapped(*args, **kwargs): return result except Exception: handle_exception(filepath) - state["func"] = ( - get_reloaded_function(caller_globals, - caller_locals, - function_frame_info, - function) - or state["function"] - ) wrapped.__signature__ = inspect.signature(function) # type: ignore caller_locals[function.__name__] = wrapped diff --git a/reloading/test_reloading.py b/reloading/test_reloading.py index c9d2393..99b56ba 100644 --- a/reloading/test_reloading.py +++ b/reloading/test_reloading.py @@ -1,6 +1,7 @@ import unittest +import sys import os -import subprocess as sp +import subprocess import time from reloading import reloading @@ -17,11 +18,14 @@ def run_and_update_source(init_src, updated_src=None, update_after=0.5): f.write(init_src) cmd = ["python", SRC_FILE_NAME] - with sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE) as proc: + with subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) as proc: if updated_src is not None: time.sleep(update_after) with open(SRC_FILE_NAME, "w") as f: f.write(updated_src) + f.flush() try: stdout, _ = proc.communicate(timeout=2) @@ -46,7 +50,8 @@ def test_no_argument(self): if i > 10: break - self.assertEqual(i, 11) + if sys.version_info.major >= 3 and sys.version_info.minor >= 13: + self.assertEqual(i, 11) def test_range_pass(self): for _ in reloading(range(10)): @@ -57,7 +62,8 @@ def test_range_body(self): for _ in reloading(range(10)): i += 1 - self.assertEqual(i, 10) + if sys.version_info.major >= 3 and sys.version_info.minor >= 13: + self.assertEqual(i, 10) def test_complex_iteration_variables(self): i = 0 @@ -65,8 +71,9 @@ def test_complex_iteration_variables(self): for j, (a, b) in reloading(enumerate(zip(range(10), range(10)))): i += 1 - self.assertEqual(i, 10) - self.assertEqual(j, 9) + if sys.version_info.major >= 3 and sys.version_info.minor >= 13: + self.assertEqual(i, 10) + self.assertEqual(j, 9) class TestReloadingWhileLoopWithoutChanges(unittest.TestCase): @@ -84,7 +91,8 @@ def test_true_break(self): if i > 9: break - self.assertEqual(i, 10) + if sys.version_info.major >= 3 and sys.version_info.minor >= 13: + self.assertEqual(i, 10) def test_condition_changes(self): i = 0 @@ -98,7 +106,8 @@ def condition(): # type: ignore def condition(): return False - self.assertEqual(i, 10) + if sys.version_info.major >= 3 and sys.version_info.minor >= 13: + self.assertEqual(i, 10) def test_condition(self): i = 0 @@ -126,7 +135,7 @@ def test_function_return_value(self): def function(): return "result" - self.assertTrue(function() == "result") + self.assertEqual(function(), "result") def test_nested_function(self): def outer(): @@ -135,7 +144,7 @@ def inner(): return "result" return inner() - self.assertTrue(outer() == "result") + self.assertEqual(outer(), "result") def test_function_signature_is_preserved(self): @reloading @@ -143,7 +152,7 @@ def some_func(a, b, c): return "result" import inspect - self.assertTrue(str(inspect.signature(some_func)) == "(a, b, c)") + self.assertEqual(str(inspect.signature(some_func)), "(a, b, c)") class TestReloadingForLoopWithChanges(unittest.TestCase): @@ -287,7 +296,8 @@ def test_nested_loop(self): replace("static = 'A'", "static = 'D'"), ) - self.assertTrue("AB" in stdout and "AC" in stdout) + self.assertIn("AB", stdout) + self.assertIn("AC", stdout) class TestReloadingWhileLoopWithChanges(unittest.TestCase): @@ -348,7 +358,9 @@ def some_func(a, b): init_src=code, updated_src=code.replace("a+b", "a-b"), ) - self.assertTrue("3" in stdout and "1" in stdout) + + self.assertIn("3", stdout) + self.assertIn("1", stdout) def test_nested_function(self): code = """ @@ -372,7 +384,9 @@ def inner(x): updated_src=code.replace("dynamic = 'B'", "dynamic = 'C'"). replace("static = 'D'", "static = 'D'"), ) - self.assertTrue("AB" in stdout and "AC" in stdout) + + self.assertIn("AB", stdout) + self.assertIn("AC", stdout) if __name__ == "__main__": From 4aa5a8d50b761e8b5c0d37eed8ddcc1126333bab Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Wed, 18 Dec 2024 22:39:11 +0100 Subject: [PATCH 17/65] Fix typo --- .github/workflows/python-testing.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/python-testing.yml b/.github/workflows/python-testing.yml index 459dfe5..163b97e 100644 --- a/.github/workflows/python-testing.yml +++ b/.github/workflows/python-testing.yml @@ -20,7 +20,7 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install dependencies run: python -m pip install --upgrade pip - - name: Install relaoding (as editable) + - name: Install reloading (as editable) run: pip install -e ".[development]" - name: Lint with flake8. Stop if syntax errors or undefined variables. run: | @@ -35,6 +35,4 @@ jobs: - name: Type check with pyright run: pyright - name: Test with unittest - run: | - cd reloading - python -m unittest + run: python -m unittest From e4b89fd241c1920084ef893997d57a6b4bb49060 Mon Sep 17 00:00:00 2001 From: nneskildsf <54531016+nneskildsf@users.noreply.github.com> Date: Wed, 18 Dec 2024 23:03:31 +0100 Subject: [PATCH 18/65] Update README.md --- README.md | 145 ++++++++++++++---------------------------------------- 1 file changed, 36 insertions(+), 109 deletions(-) diff --git a/README.md b/README.md index 7903a72..8a855b6 100644 --- a/README.md +++ b/README.md @@ -1,144 +1,71 @@ -# reloading -[![pypi badge](https://img.shields.io/pypi/v/reloading?color=%230c0)](https://pypi.org/project/reloading/) - -A Python utility to reload a loop body from source on each iteration without -losing state - -Useful for editing source code during training of deep learning models. This lets -you e.g. add logging, print statistics or save the model without restarting the -training and, therefore, without losing the training progress. - -![Demo](https://github.com/julvo/reloading/blob/master/examples/demo/demo.gif) +This is a fork of https://github.com/julvo/reloading with the following improvements: +* Typing (pyright compliance) +* Linting (flak8 compliance) +* Expanded test suite +* Supports multiple invocations of `reloading` in a single file +* Supports `while` loop +* Preserves function signature for functions decorated with `@reloading` +* CI with Github Actions workflow +* Reload code only if source code file has been changed +* With Python 3.13: Exports locals of reloaded loop to parent locals + +# Reloading +A Python utility to reload a function or loop body from source on each iteration without losing state. ## Install ``` -pip install reloading +pip install git+https://github.com/nneskildsf/reloading.git ``` ## Usage -To reload the body of a `for` loop from source before each iteration, simply -wrap the iterator with `reloading`, e.g. +To reload the body of a `for` loop from source before each iteration, wrap the iterator with `reloading`: ```python from reloading import reloading for i in reloading(range(10)): - # this code will be reloaded before each iteration + # This code will be reloaded before each iteration print(i) +``` +To reload the body and condition of a `while` loop from source before each iteration, wrap the condition with `reloading`: +```python +from reloading import reloading + +i = 0 +while reloading(i<10): + # This code and the condition (i<10) will be reloaded before each iteration + print(i) + i += 1 ``` To reload a function from source before each execution, decorate the function -definition with `@reloading`, e.g. +definition with `@reloading`: ```python from reloading import reloading @reloading -def some_function(): - # this code will be reloaded before each invocation +def function(): + # This code will be reloaded before each function call pass ``` ## Additional Options -Pass `None` instead of an iterable to create an endless reloading loop, e.g. +To iterate forever in a `for` loop you can omit the argument: ```python -for i in reloading(): - # this code will loop forever and reload from source before each iteration - pass -``` - -## Examples - -Here are the short snippets of how to use reloading with your favourite library. -For complete examples, check out the [examples folder](https://github.com/julvo/reloading/blob/master/examples). - -### PyTorch -```python -for epoch in reloading(range(NB_EPOCHS)): - # the code inside this outer loop will be reloaded before each epoch - - for images, targets in dataloader: - optimiser.zero_grad() - predictions = model(images) - loss = F.cross_entropy(predictions, targets) - loss.backward() - optimiser.step() -``` -[Here](https://github.com/julvo/reloading/blob/master/examples/pytorch/train.py) is a full PyTorch example. - -### fastai -```python -@reloading -def update_learner(learner): - # this function will be reloaded from source before each epoch so that you - # can make changes to the learner while the training is running - pass - -class LearnerUpdater(LearnerCallback): - def on_epoch_begin(self, **kwargs): - update_learner(self.learn) - -path = untar_data(URLs.MNIST_SAMPLE) -data = ImageDataBunch.from_folder(path) -learn = cnn_learner(data, models.resnet18, metrics=accuracy, - callback_fns=[LearnerUpdater]) -learn.fit(10) -``` -[Here](https://github.com/julvo/reloading/blob/master/examples/fastai/train.py) is a full fastai example. +from reloading import reloading -### Keras -```python -@reloading -def update_model(model): - # this function will be reloaded from source before each epoch so that you - # can make changes to the model while the training is running using - # K.set_value() +for _ in reloading(): + # This code will loop forever and reload from source before each iteration pass - -class ModelUpdater(Callback): - def on_epoch_begin(self, epoch, logs=None): - update_model(self.model) - -model = Sequential() -model.add(Dense(64, activation='relu', input_dim=20)) -model.add(Dense(10, activation='softmax')) - -sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) -model.compile(loss='categorical_crossentropy', - optimizer=sgd, - metrics=['accuracy']) - -model.fit(x_train, y_train, - epochs=200, - batch_size=128, - callbacks=[ModelUpdater()]) -``` -[Here](https://github.com/julvo/reloading/blob/master/examples/keras/train.py) is a full Keras example. - -### TensorFlow -```python -for epoch in reloading(range(NB_EPOCHS)): - # the code inside this outer loop will be reloaded from source - # before each epoch so that you can change it during training - - train_loss.reset_states() - train_accuracy.reset_states() - test_loss.reset_states() - test_accuracy.reset_states() - - for images, labels in tqdm(train_ds): - train_step(images, labels) - - for test_images, test_labels in tqdm(test_ds): - test_step(test_images, test_labels) ``` -[Here](https://github.com/julvo/reloading/blob/master/examples/tensorflow/train.py) is a full TensorFlow example. -## Type Check and Testing +## Lint, Type Check and Testing Run: ``` +$ flake8 $ pyright -$ python reloading/test_reloading.py +$ python -m unittest ``` From 07d9d959e34ae424dc52c658ec8b916aabf1e1d2 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Thu, 19 Dec 2024 06:41:56 +0100 Subject: [PATCH 19/65] Add helpful log messages. --- reloading/reloading.py | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/reloading/reloading.py b/reloading/reloading.py index dc3e93f..352c3c4 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -215,7 +215,7 @@ def get_loop_object(loop_frame_info: inspect.FrameInfo, Traverse AST for the entire reloaded file in a search for the loop which is reloaded. """ - candidates = [] + candidates: List[Union[ast.For, ast.While]] = [] for node in ast.walk(reloaded_file_ast): if isinstance(node, ast.For) and isinstance(node.iter, ast.Call): if getattr(node.iter.func, "id") == "reloading" and ( @@ -496,6 +496,11 @@ def sorting_function(candidate): function_node_ast = deepcopy(reloaded_file_ast) function_node_ast.body = [function_node] return function_node_ast + else: + log.error(f'Unable to reload function "{function_name}" with ' + f'in file {function_frame_info.filename}. ' + 'The function might have been renamed or the ' + 'decorator might have been removed.') return None @@ -539,34 +544,34 @@ def _reloading_function(function: Callable) -> Callable: caller_locals = function_frame_info.frame.f_locals file_stat: int = os.stat(filepath).st_mtime_ns - - # crutch to use dict as python2 doesn't support nonlocal - state = { - "function": get_reloaded_function(caller_globals, - caller_locals, - function_frame_info, - function), - "reloads": 0, - } + rfunction = get_reloaded_function(caller_globals, + caller_locals, + function_frame_info, + function) + i: int = 0 def wrapped(*args, **kwargs): - nonlocal file_stat + nonlocal file_stat, function, rfunction, i # Reload code if possibly modified if file_stat != os.stat(filepath).st_mtime_ns: - log.info(f'Function at line {function_frame_info.lineno} ' + log.info(f'Function "{function.__name__}" at line ' + f'{function_frame_info.lineno} ' f'of file "{filepath}" has been reloaded.') - state["function"] = ( + rfunction = ( get_reloaded_function(caller_globals, caller_locals, function_frame_info, function) - or state["function"] + or rfunction ) file_stat = os.stat(filepath).st_mtime_ns - state["reloads"] += 1 + i += 1 while True: try: - result = state["function"](*args, **kwargs) + assert rfunction is not None, ( + 'Unable to load function "{function.__name__}" at line ' + f'{function_frame_info.lineno} of file "{filepath}".') + result = rfunction(*args, **kwargs) return result except Exception: handle_exception(filepath) From 3923ef4d5421e0fe4ab1500ac09b228fe7489d15 Mon Sep 17 00:00:00 2001 From: nneskildsf <54531016+nneskildsf@users.noreply.github.com> Date: Thu, 19 Dec 2024 06:51:55 +0100 Subject: [PATCH 20/65] Update README.md --- README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/README.md b/README.md index 8a855b6..f268013 100644 --- a/README.md +++ b/README.md @@ -61,10 +61,27 @@ for _ in reloading(): pass ``` +## Known Issus + +On Python version less than 3.13 it is not possible to properly export the local variables from a loop to parent locals. The following example demonstrates this: +```python +from reloading import reloading + +def function(): + i = 0 + while reloading(i < 10): + i += 1 + print(i) + +function() # Prints 0. Not 10 as expected. +``` +A warning is emitted when the issue arises: `WARNING:reloading:Variable(s) "i" in reloaded loop were not exported to the scope which called the reloaded loop at line...`. + ## Lint, Type Check and Testing Run: ``` +$ pip install -e ".[development]" $ flake8 $ pyright $ python -m unittest From cb42029dc465327c123062cbef1ec6ce1cd5a233 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Thu, 19 Dec 2024 06:55:51 +0100 Subject: [PATCH 21/65] Only give warning if relevant. --- reloading/reloading.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reloading/reloading.py b/reloading/reloading.py index 352c3c4..900e241 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -417,7 +417,7 @@ def _reloading_loop(seq: Union[Iterable, bool]) -> Iterable: # print(i) loop_caller_frame: inspect.FrameInfo = stack[3] loop_caller_frame.frame.f_locals.update(loop_frame_info.frame.f_locals) - else: + elif len(stack) > 3: variables = ", ".join( f'"{k}"' for k in loop_frame_info.frame.f_locals.keys()) log.warning(f"Variable(s) {variables} in reloaded loop were not " From 8cda4da41acd27526a8b781344a5eed6bc61fb6d Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Thu, 19 Dec 2024 07:10:54 +0100 Subject: [PATCH 22/65] Remove stale examples. Readme example of how to install without git. --- .gitattributes | 2 + README.md | 4 ++ examples/demo/demo.gif | Bin 677236 -> 0 bytes examples/demo/demo.py | 14 ---- examples/fastai/requirements.txt | 1 - examples/fastai/train.py | 42 ------------ examples/keras/requirements.txt | 2 - examples/keras/train.py | 45 ------------- examples/pytorch/requirements.txt | 3 - examples/pytorch/train.py | 44 ------------- examples/tensorflow/requirements.txt | 2 - examples/tensorflow/train.py | 95 --------------------------- 12 files changed, 6 insertions(+), 248 deletions(-) create mode 100644 .gitattributes delete mode 100644 examples/demo/demo.gif delete mode 100644 examples/demo/demo.py delete mode 100644 examples/fastai/requirements.txt delete mode 100644 examples/fastai/train.py delete mode 100644 examples/keras/requirements.txt delete mode 100644 examples/keras/train.py delete mode 100644 examples/pytorch/requirements.txt delete mode 100644 examples/pytorch/train.py delete mode 100644 examples/tensorflow/requirements.txt delete mode 100644 examples/tensorflow/train.py diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..06e8c78 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# git-archive: ignore .gitignore, .gitattributes, .github/ etc. +.git* export-ignore diff --git a/README.md b/README.md index f268013..357edc5 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,10 @@ A Python utility to reload a function or loop body from source on each iteration ``` pip install git+https://github.com/nneskildsf/reloading.git ``` +or if you do not have Git +``` +pip install https://github.com/nneskildsf/reloading/archive/refs/heads/master.zip +``` ## Usage diff --git a/examples/demo/demo.gif b/examples/demo/demo.gif deleted file mode 100644 index 803e46f04e5e8b68a468e86d8b1b29333237d1b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 677236 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

A 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

P%kZJgQ6+H&dZG96a=mpxB{r=$QPVv>zaqaO!5 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"q2;mb)?;6N2 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�all}s7Yn@S7F><&oZK=1Fo zn4=Njf8Y#QN5H{J&O}!J19c%ev|pq{&>n-tPu12}`xaBq@;rCFl(S#fk=CseFK%^r z%wVZG2)4mJ<@3&`LhH@VhN?~8b)4pbUh1_*xu{%H5qE1{IMb0Ws0v*rqj_N6u(yY8gd&lPGWl-ljG8OXXnSEQeC$Ku1K{v7o^#a>|9hG?6? zyid<1%U0<5#Ny(+fiG~P~mH@vazM? zZjkX4@}7g48@fdA)uX%k18U1XKX%=_(H3uZ98*E%vK?-6a)62w0dI`$MIK)gRMuK` zyR&W>#_rGtagjzS!h2Jg)#X*rb*i~X=(sY1Il@2$upy{yHa>WWKx6{D1-0p7SCIwP z7g_~<)CjOJ3KM`L*_a>mXyc5&9fNZO&aUHXCI!Qxu+n;qQhrirrZ;v*TC5t49SK}o=~?nb6Y!iZBXUo zCJ9wPTcwrcZj>xg+|q{Hq-qI){Mu%`04M$gdh@@MpsgH#aS{d;vT5K$t1^$y>cU&g zM!_8GODjgf<94M#GdfnbnWT*vl2AHOOv(Rc`u%zQ{g%=3n^ABjqoeZSweP0ii;p7^ zOoTf9Nm1v`6$#pR)9+(r)qiXH_53d~I({C1E8C27{3WenA7jnG;lCcfRQzh|m*7$R z?L{WruAx7F#C~R9y#5CEba9~{B_DaNw&>egH9>woiL=1i?z-gF6h&PEjm=n*pzTFj zakiQNPV=bStDH#25>Z51p8yw4&haJW&){!bB=7e`e*n?W?%FmDL=@>pQq()kA%*r_Q;(0OiUotxCOa01OD-tv~+^eNr z`FviH?t#9pEXCTsxsr=5O_A1SVRH~C9_2-uKEXQgX)7@NxtCQ{>ZYzf0;>Ogzt@0y zHm55T|K3WBI6+P(4mY_enBKw-@sJs<6!&Wj{s+R3YxQh#l!p)HVXYA&`=6-XpW1RS z3f>{-+)zU%B-fqrb0#&RcQy3aiXE;HEyk8kyzKzO?A~>%I>s+=vzd3dG}|k7a%ta- z$F*&hjJ?#Ov6dd=sB9u&14?G>V%He8dte<0#7a`MXsT!D26e&iWEHZW4s6I{`_p*K znbE!vW*#oA_rs=F*&6o)c2Bla=)Hl59vry0M-bTm;DVlQ>}$?8a}HTj`?1a5??_mf zh}UyShbFFj%jwFS7Ax~p<=YL9g{M}n5g^J!XO4ZJG%Q*!RG7xsova44Q|}`hvP4L-(hO= z6ZLfu5ER{v#b@~sC9l6aeFmAi6;-Y6m8WaI}v-Ll97x5pdGcUI-bwrKqenAJdx-Iixa@N*y(4; z9TWukWojnO>T0zf+x4qlUC6X)ayK&#XyNhZ&o7aZX*az8HZiz6U+QB=`?^ml(NofhYcxjaS`wyDb+y2K!^MtXDDo7tGYi_j>G`eO@VD$elUHRLwKnxY+j(38JYOXR(ecqE?<3w14v*Lw?h0$zE zKtu=$?Ajy`IF?m&p;*>LZl=w_`~0Rdgc7nHs{6PQa26_BLSl!c{6NiC&Vc2?$^8!p zXW#N$|1Sn-5Ulu*gHzN^IkV<}8k}d;>BT3wN2hIngd1_rfU5233etaOv?}M}V^!jA;BQY4m z@PMbWhD(Bfk(O{=5u%{w()TpuT&6QA#LyrtF~R4u!CA)MHfu>l(8?L$8L=}rGzdxl z(;2XmmQd-|7?)BlG<=RwYKqI&?sa@#d=>*LN7d?dH0S2)ip0xdUZf~*bBJH^nJTYI zZ8dXAEtuphtewy5yYT$<6IfXs=j18AQ9lGK8wFa$kQ8g4Hi4aP;wkz8UIPWSd*KRA zi5-TKN>^xj6}gL(XfAd=Z&dc{?`a8hcgypy%}+fTiVLf&j=ur4yF9iHh6T_plXT|L zwcM+W@RyO+L9;Eo_Lm%aAbWOe)(fnM12-h2IpIb*30{?nToQCr7czM!$Pp{Rq(iV3 z(?EyDGoAq`k-}`eZLUgd>@gI!KV^*<7-w+dgK?ICum}B8zspgdRJhIRS2cZ38(*#Q z;gY|8V8DxJ{NbMA*Msj$Htw?5y~mTU_HjKT;??B=%3JK_Qc8Kpwduyo#6RCpXNJg%aZz7}0A^e7vZP!T~ z1ZE@n9~{1Y%*lq7#Gzx-Hmrl8XR$-|yH7qYd1;lY^S)dA+P}?FeT82-&wQ-d~+%ae=8^yyke+PSZ!l6d?GtkFapJpZ@TSpaw7hXQ- z$c>%wjWlqeSi~Qo#*;Y~2#P-JU_{`m^O}Q~blfe8l`qlL)F(DKA_cT|bT~t=h8Zpd zD;(N`2jUu@Sk3!Ns;U&+0N~d?GX{~PFa*D zw^UXq$6?K{oLe`g*KXY#l=VJm+OF8}UT5#2`uAsNzuZSoTrJe>bGDstC|>um)A083 zPtLlc!)%i^1q_T2K>;E-O*%qI7DM`QlF^e*xAIZK-APb5+ZQRTd@dmh$cKwCNY6x5 ze@{Xzk5k@%I8OiFJ2dQH-=Wg~H}BBs@9)ryKdcZd@6h#G@&7)2=6@Wgz1P>y6+Pkv zR{R-NIk#b%gjf!&xV?g^Ac)I>75_>?$k>M4{~D*kBR*15KgVfN$;9u*=`RxEckfUk zKc8KKQl*pord6NI(_RQ9Po9!Pn-)6Hdj#&-5*`pT2zp+&SpS2B_=T#Z8thm>RZ{&% zOLw_9A_o~-ggyP~%%eg_+|{GB>*75m<(I=}j^DK?p!LRXq(1aDQ;KqO$!e_&` zH5jE^O&WcJJQzjp5=ShV6gv3!n8}sy^o}RGEdkh%$g~Y$AAvP!g`3&M>hr(u@x~M> zLTWMA6NcEYyXPdS+Apv=?I8c+7bh#xqA&YF8SiTW9|pP3K6JRZZ7tPm^m^(N=F$j! z60irCRL>^B5@!?o+7n+m_xZGm5ja)|+r;E*GzY-v`#9PBp$F{qN}4Fi(%BSw{M5@n z(0tG%21Vqe0Z$4}WEE8DiQro};WNEBoK|R{p5hMHSvEga)A3sA0q(hGK?fuJ*EzU; zO7aKTb6N{tIe-@~0NK+IKkuVucYL<2wyM;mth$#bY#uMjv*~Iz5l7u=UZjP?%om8laXZW_0oB{` z4)KCCFSs@m2<$Bs#F1TWXAF96Z`FB=Ww4_R(5LL<2oQCqNR+{+kR0`7S;34L@)~K` zn6S83S03YDJ{VnMN-xWB$Sh9;sg+w_NP&HDU@SKBe~pavsff|tQwxj*yF;$gRb#evq8I5JNo(v7^>{+hgvCdtQ>a2mt&G$rhJUbV2WR1BUO`$ATT)P!G&8;cPDThno+ktcl z_k2<6F6my62l9^l`@0n8mifCJuYB?12h_kB@w-D?N6X5s?$zCSLEgAf^^(;hw7bGB zQ>uKXx?A_!8Rdt7by?a?(+D$=BtU0_T(FK;SGZhW&TKwzzh!S3w*kP0V{5k1p$`$h z>;}(7@iSK!9BljH!m6YQ1mH|>f?jAq$Y@0 zH)r-s3E;^MpHClva1lS#-(le-I;)O9+_kE8T1aQ#&E3JcM)909yeT;TLhl))aZ;K22_{1&r# zBv4Q_KqBizB$B2g-df=Ik(xOT4vkGo7#zXjvD3-?_$XEH1(psBN3~ycdzvnnYz!ZS zkemd*<~v9@r#Z$b?F;r`I|<5jZ)=De>;=Wnb(}v6xBvWYt=oYA``i4AU(Avg;A&#F zHyvkruD5f!BuKxC-~Z;=WWyzs8?FOOGYKaFH7S*oor75r&5x36HwT7 zX;xA-UP=0)JfA>(7cCo0R&C%yQgGqw`xT?*OQ^_`FMKxUnB#=U0Ho|}lTf-+vUS8&rd|jnTem%w?h|A7=NPENG{gNq=Gn5iXu1 zVEn4om46SM56vMs*drBR=o(eNek-2N(kG2EQL1to1f%;VuV|K_d>3C-D!Cbfaq!gL7edTU)Ejc($C z)s^Q=+bF#(SEG~(#hmPZ@KaZ6)x>FYH{*azp7Q_5GjGQ3iDngE$D28yEacBf*bBsf zSgX_SrWTTGsZZhJ-8Q7T>I$eS6B zQU%@7;@B72yQ|W*aQY0e2#>m%>@5ti&DU9KHNR0ti9b~%X)A*;+MKNDXcd5hN9v{$q`p|H+|XVZj!o_=iEqv znb`45InPGL9kq0;wdcYjpLaidHnV7bVrpR9D%pm0;-AcB1g$i&82JsbPj*scGg{?>Lw&?;zgKyasc~AAM}XkO9q<&h5B*WrVAi<0AWO+nvGQLn_)zZ-G_@D zsyi>4_Is!c!&%%s(1L%$5p4Q*x7ne8z0E}b_uK4^CzJvTv&XM|&+%S{x}LPF+nfGP zFzElXxW5a;n*VQZvkoSe?-$hNsj!K|c>lB8Z1Rtc_n(46e#fjgJ$JvDBaQr{3oYT_<5WxfbGjAibN`x3zs z?sgUW$E>jLM>9no0WDo9$>whB-WN&`1k&rW+SI!$x@6peBT~WXyH8aQX6&9f2SxXD z(-m81UR83^t2He~a*%c;@T-7k(h+-$_hUV&2)o;fEQtgmVF|@mbGDxU!h`)9S8wr zDt3-QS9*M8Gh8a_=B+tUoKx1`<(aZ}>!z0wVD^j>F8DHFwLJvRwh$yx@E*oocx8@M zL!PX<)u1x$Ovo9e(Ro$?_{w854!E#1wky^9bhJPv>oLmct-6Hg6pC^n3?HTmBh0dq zCLIuRSs&Davr2amo0UaqQLC-U=pd9SZZ5A)hSL~tA`&L{Y`Uc@;5@LUFHBe22PrK8n@s zjZa%$C*0#7)OzM_caiRuWvJ_Yb`KbjZyZrv?{(@AP*;4h(KGAYM>qnph3;jjtC<6J zy$vGe|}y zEUqu|8-d&2jW&rq%akZ9k#=dGM21ga%(mulTx0oGJE6!L26xZ5iDTTP3XlYrtSr@v z`lGWHp2N1#BIM;6v1&6tmFuf_bQ{GfyLZL0qS4=#Oe?})4B!Rag?RsIuE*ejzwT%F z89$<~1F+fTGs?fX-<5ub4G{>c;TP+lN~Rhmr;L0~CX7vO*-*LrCI7S2PD7QfS!-IHj_!H)s2;DUR^> zH}3bZgug$POg}NV4RJ@7l}!JNxdm@Mfn8QItxy;WO7uTd82{lQTj^);`}?_G=%{&2 zN#TH3qF+%WF86!j^Kw6ffmsurze&k0;taH*z z;IrHJkXR1pX0v|RpSa)4D+ig`O8kib%L{c=WiKnU&$3@$_k;JA*KfTa zKYv$cI!Nm8H3jlt1zaM3Qe!SVSb4t$<@q){^nJenu9h_g8}kr1e)fL+J59k&`fq~r z-)Rc|U!cZ*JM_=|<3oQXeE8?@>MyCWzxrJzBB4+Ng*s9a_{|E(V+v8CVj)Axj1*3N zL>NiPmp!>0Bwn~p4yh9chr?mNz7+uQ01J>S|KVHxuA{}WLFP{pL_hQ&zwc=IH3R-9 z8gqFD{D1td{y8Y~KYpua@&6xi_rIS3e-QsKzwP!KPyutGCAKe{OO*2-Lx_@!Nrzth zQF7>zzCQ4{x_k)_~utpUi;0@fA?yE zF_3(8v;R!VJv6KlgOivH<0l_rJwp|UJh1@dn?Cs!(G96k^;iO%NEWW6n!!_?%FDsL zJBvHH%3!Mz^<6A{Jc*Fd;j$PPNL91JO2cN9b*ZW@m59Kr%Pq_(^VjRfDA7T!tL z7g(ZLC=R*Eg=H&Rt>#s8{gTz8J06h7Li+WsZtIs!J7w7;a>@2mXNULb+o`kBp6^)V z`8k7INCnwDjfC?vTt}d5QVb74XV&1>c?K|lg50TIV*n;s4j3brc4)nE2D70xvq{&4Aw9SS~2hP)r zN5%mpfgx+?6>cxU3>1&BSmT=#GciKqAJ=bF;uu5^Tjh&o6F|8~RY`|~^ZA8Knv@>B z#aa%J1+d0A>Hm}lh<~poC?C(7QZThHTn-+zw)x5cM$lfYEg*h8QjP4vz{fXhbb) zwn)SwfB>WI+{2V;WH63*J#1Vozb_LT!m$8?T3!rl_(1Yu06$C+8>dE^G{|61XokV+ zkvu6y@Hq@5)N|sg1euvg6t=sf0 zOsTKnDIQlsUx7?{8K}c)?Xlavnf0>V4$tYpTPn$iULZv%o8ybEbe^D|(#T*K1&fa{ zmB{mLC2ID&?CCpSZ9F#u0)>ij2|#3gwoU(8BRXiVS$gJV1>fxXlMoLACjpm%xdYy- z8X+CC?ejFuKwfTToJqkE(p0Pkhr?f8Vj%!?!`YNrdqPm?8(%a1IfD_$g9Itjhx-&) zhg?fM=5|RUff*?(7Xuly-O7wVmFM(gvtNn~AWSincF=sVk;;|;2K+Q9(t59SMNl=4-;V9QPZH6aln1r(B7^68x6)1^%!PU2UOY2T!x54eG z6A|k_O3-wXIiTnlD_G{K(>!((Jxhd#$|W?=+KoCWm;0pyM)2#mio>RDb0DqfnTr^A zh@9CjTc{Z&ymPu$71|3y5&a*wY`$m7hN`=gRNnPlELL zPvz_bjf_nIgur)?Sn~{f-76L4!N`iRlcqetDc9YtRliPJOGVPFF!Kl! zNuYMvv=U8ecsk^`zhT!#9?ukXD&Ybj*S#;~tXk5}kTkd66Gpxs8v$n?Dk`4_V&gR< zULRfhJofDP60Tkv_EwzyWl|dQ@%qi<@16i$HWX8GHAOcfO^tiu_DzB69PIpf9$J?G zU(}<+Votac=+GFti6-n#JCxkFo5%44N(Sx(z}|4d9!EpRt}rBq8IM2GdEIdY{V;j= zFa=~7tp6BX6Bd1b@11s>9SOIQ4Rd=6Y@mg6vV{%n!i|Q**DZvT7Q#0I3`7;omQyAe z6Y*B@#M@mFw$nN`G-EU?!j=``;v4Cn5ot*eN2G*rWQW00BG&6i!QVnnrXwAa!~HX& z0_vjn4oA^S!r@~uBpAIfIC>8ecfcxIV_Gy$k$C65N^(=EUcZVs0)NHHD6TFhj;M5P zX+rgQbxfSFQtG>-J%>qRW-;u;su>v}9e1LO@H(RT`wu%Ac^{4|$%refi!1Ss6T}Bk zPw2w<-Se7aE_cMFDENuuouPu1YZDrgXH*&&VyB^rbvvWNG+xiL{nuAQspT*XL+3rw%elw_EmG|(+5y2-z%X!;%DZatjA_40151zg95&jg*7%I)@JNPNW9C7; zq987FA}`gXU+o%84^Bbd$Jq@qF*|1!PF_9Dd@fjWRp^8tuke*L5<_viD0({`IWdOV zOAW0>rC%wP0B8^gD(~VfOqPVQ2|S&lgfk;xq5W#N*%`Mwal>QTSC;|#5u+v*`~ZurlU8@HEdG>&(ZQ5(8@xd300;0qv=&={bgiItyH{=ANJ;^F;ju zV^MRYv)ozd;QiP+-1nq1L*r5D`Y6g1=aHUJg7ZTl|vN)kR$H5K-5#;3C

kp^AnUb3)R!yntv%& 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 diff --git a/examples/demo/demo.py b/examples/demo/demo.py deleted file mode 100644 index 57c881b..0000000 --- a/examples/demo/demo.py +++ /dev/null @@ -1,14 +0,0 @@ -import time -import sys -sys.path.insert(0, '../..') -from reloading import reloading - -epochs = 10000 -loss = 100 -model = { 'weights': [0.2, 0.1, 0.4, 0.8, 0.1] } - -for i in reloading(range(epochs)): - time.sleep(2) - loss /= 2 - - print('Epoch:', i, 'Loss:', loss) diff --git a/examples/fastai/requirements.txt b/examples/fastai/requirements.txt deleted file mode 100644 index 8a8b543..0000000 --- a/examples/fastai/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -fastai \ No newline at end of file diff --git a/examples/fastai/train.py b/examples/fastai/train.py deleted file mode 100644 index badab9e..0000000 --- a/examples/fastai/train.py +++ /dev/null @@ -1,42 +0,0 @@ -import sys -sys.path.insert(0, '../..') -from reloading import reloading - -from fastai.basic_train import LearnerCallback -from fastai.vision import (URLs, untar_data, ImageDataBunch, - cnn_learner, models, accuracy) - - -@reloading -def set_learning_rate(learner): - # Change the learning rate below during the training - learner.opt.opt.lr = 1e-3 - print('Set LR to', learner.opt.opt.lr) - -class LearningRateSetter(LearnerCallback): - def on_epoch_begin(self, **kwargs): - set_learning_rate(self.learn) - - -@reloading -def print_model_statistics(model): - # Uncomment the following lines after during the training - # to start printing statistics - # - # print('{: <28} {: <7} {: <7}'.format('NAME', ' MEAN', ' STDDEV')) - # for name, param in model.named_parameters(): - # mean = param.mean().item() - # std = param.std().item() - # print('{: <28} {: 6.4f} {: 6.4f}'.format(name, mean, std)) - pass - -class ModelStatsPrinter(LearnerCallback): - def on_epoch_begin(self, **kwargs): - print_model_statistics(self.learn.model) - - -path = untar_data(URLs.MNIST_SAMPLE) -data = ImageDataBunch.from_folder(path) -learn = cnn_learner(data, models.resnet18, metrics=accuracy, - callback_fns=[ModelStatsPrinter, LearningRateSetter]) -learn.fit(10) diff --git a/examples/keras/requirements.txt b/examples/keras/requirements.txt deleted file mode 100644 index 068d5df..0000000 --- a/examples/keras/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -keras -numpy \ No newline at end of file diff --git a/examples/keras/train.py b/examples/keras/train.py deleted file mode 100644 index 4d71bd1..0000000 --- a/examples/keras/train.py +++ /dev/null @@ -1,45 +0,0 @@ -# Example taken from https://keras.io/getting-started/sequential-model-guide/#examples -import sys -sys.path.insert(0, '../..') -from reloading import reloading - -import keras -from keras import backend as K -from keras.models import Sequential -from keras.layers import Dense, Activation -from keras.optimizers import SGD -from keras.callbacks import Callback - - -@reloading -def set_learning_rate(model): - # Change the below value during training and see how it updates - K.set_value(model.optimizer.lr, 1e-3) - print('Set LR to', K.get_value(model.optimizer.lr)) - -class LearningRateSetter(Callback): - def on_epoch_begin(self, epoch, logs=None): - set_learning_rate(self.model) - - -# Generate dummy data -import numpy as np -x_train = np.random.random((10000, 20)) -y_train = keras.utils.to_categorical(np.random.randint(10, size=(10000, 1)), num_classes=10) -x_test = np.random.random((1000, 20)) -y_test = keras.utils.to_categorical(np.random.randint(10, size=(1000, 1)), num_classes=10) - -model = Sequential() -model.add(Dense(64, activation='relu', input_dim=20)) -model.add(Dense(10, activation='softmax')) - -sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) -model.compile(loss='categorical_crossentropy', - optimizer=sgd, - metrics=['accuracy']) - -model.fit(x_train, y_train, - epochs=200, - batch_size=128, - callbacks=[LearningRateSetter()]) -score = model.evaluate(x_test, y_test, batch_size=128) \ No newline at end of file diff --git a/examples/pytorch/requirements.txt b/examples/pytorch/requirements.txt deleted file mode 100644 index be3d297..0000000 --- a/examples/pytorch/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -torch -torchvision -tqdm diff --git a/examples/pytorch/train.py b/examples/pytorch/train.py deleted file mode 100644 index b3cd304..0000000 --- a/examples/pytorch/train.py +++ /dev/null @@ -1,44 +0,0 @@ -import sys -sys.path.insert(0, '../..') -from reloading import reloading - -from torch import nn -from torch.optim import Adam -import torch.nn.functional as F -from torchvision.models import resnet18 -from torchvision.datasets import FashionMNIST -from torchvision.transforms import ToTensor -from torch.utils.data import DataLoader -from tqdm import tqdm - - -dataset = FashionMNIST('.', download=True, transform=ToTensor()) -dataloader = DataLoader(dataset, batch_size=8) - -model = resnet18(pretrained=True) -model.fc = nn.Linear(model.fc.in_features, 10) - -optimiser = Adam(model.parameters()) - -for epoch in reloading(range(1000)): - # Try to change the code inside this loop during the training and see how the - # changes are applied without restarting the training - - model.train() - losses = [] - - for images, targets in tqdm(dataloader): - losses.append(1) - - optimiser.zero_grad() - predictions = model(images.expand(8, 3, 28, 28)) - loss = F.cross_entropy(predictions, targets) - loss.backward() - optimiser.step() - losses.append(loss.item()) - - # Here would be your validation code - - print(f'Epoch {epoch} - Loss {sum(losses) / len(losses)}') - - diff --git a/examples/tensorflow/requirements.txt b/examples/tensorflow/requirements.txt deleted file mode 100644 index af0795f..0000000 --- a/examples/tensorflow/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -tensorflow -tqdm \ No newline at end of file diff --git a/examples/tensorflow/train.py b/examples/tensorflow/train.py deleted file mode 100644 index 5fb32e8..0000000 --- a/examples/tensorflow/train.py +++ /dev/null @@ -1,95 +0,0 @@ -# Example from https://www.tensorflow.org/tutorials/quickstart/advanced - -from __future__ import absolute_import, division, print_function, unicode_literals - -import sys -sys.path.insert(0, '../..') -from reloading import reloading - -import tensorflow as tf -from tensorflow.keras.layers import Dense, Flatten, Conv2D -from tensorflow.keras import Model - -from tqdm import tqdm - -(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() -x_train, x_test = x_train / 255.0, x_test / 255.0 - -# Add a channels dimension -x_train = x_train[..., tf.newaxis] -x_test = x_test[..., tf.newaxis] - -train_ds = tf.data.Dataset.from_tensor_slices( - (x_train, y_train)).shuffle(10000).batch(32) - -test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32) - -class MyModel(Model): - def __init__(self): - super(MyModel, self).__init__() - self.conv1 = Conv2D(32, 3, activation='relu') - self.flatten = Flatten() - self.d1 = Dense(128, activation='relu') - self.d2 = Dense(10) - - def call(self, x): - x = self.conv1(x) - x = self.flatten(x) - x = self.d1(x) - return self.d2(x) - -model = MyModel() - -loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) - -optimizer = tf.keras.optimizers.Adam() - -train_loss = tf.keras.metrics.Mean(name='train_loss') -train_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy') - -test_loss = tf.keras.metrics.Mean(name='test_loss') -test_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='test_accuracy') - -@tf.function -def train_step(images, labels): - with tf.GradientTape() as tape: - predictions = model(images, training=True) - loss = loss_object(labels, predictions) - gradients = tape.gradient(loss, model.trainable_variables) - optimizer.apply_gradients(zip(gradients, model.trainable_variables)) - - train_loss(loss) - train_accuracy(labels, predictions) - -@tf.function -def test_step(images, labels): - predictions = model(images, training=False) - t_loss = loss_object(labels, predictions) - - test_loss(t_loss) - test_accuracy(labels, predictions) - -EPOCHS = 5 - -for epoch in reloading(range(EPOCHS)): - # Try to change the source code inside this loop during the training to - # see how the changes are applied without restarting the training. - # You can use it e.g. to inspect the model or changing the learning rate. - - train_loss.reset_states() - train_accuracy.reset_states() - test_loss.reset_states() - test_accuracy.reset_states() - - for images, labels in tqdm(train_ds): - train_step(images, labels) - - for test_images, test_labels in tqdm(test_ds): - test_step(test_images, test_labels) - - template = 'Epoch {}, Loss: {}, Accuracy: {}, Test Loss: {}, Test Accuracy: {}' - print(template.format(epoch+1, - train_loss.result(), - train_accuracy.result()*100, - test_loss.result(), - test_accuracy.result()*100)) \ No newline at end of file From 22d670dee1f8a61179868da4f18b515817a3bb17 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Thu, 19 Dec 2024 10:51:56 +0100 Subject: [PATCH 23/65] Handle empty iterator. Raise exception when reloading is not used as decorator or used outside of the context of a loop. Handle rename/remove of reloaded code. --- reloading/reloading.py | 75 +++++++++++++++++++------------------ reloading/test_reloading.py | 20 +++++++++- 2 files changed, 57 insertions(+), 38 deletions(-) diff --git a/reloading/reloading.py b/reloading/reloading.py index 900e241..4ba6956 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -35,6 +35,10 @@ def __iter__(self): ) +class ReloadingException(Exception): + pass + + @overload def reloading(fn_or_seq_or_bool: Iterable) -> Iterable: ... @@ -78,7 +82,7 @@ def reloading(fn_or_seq_or_bool: Optional[ A function, iterator or condition which should be reloaded from source before each invocation or iteration, respectively. """ - if fn_or_seq_or_bool: + if fn_or_seq_or_bool is not None: if isinstance(fn_or_seq_or_bool, Callable): return _reloading_function(fn_or_seq_or_bool) elif (isinstance(fn_or_seq_or_bool, Iterable) or @@ -228,6 +232,16 @@ def get_loop_object(loop_frame_info: inspect.FrameInfo, or getattr(node, "lineno", None) == loop_frame_info.lineno): candidates.append(node) + if len(candidates) == 0 and loop_id is None: + raise Exception("Reloading used outside the context of a loop.") + elif len(candidates) == 0 and loop_id: + raise ReloadingException( + f'Unable to reload loop initially defined at line ' + f'{loop_frame_info.lineno} ' + f'in file "{loop_frame_info.filename}". ' + 'The loop might have been removed.' + ) + # Select the candidate node which is closest to function_frame_info def sorting_function(candidate): return abs(candidate.lineno - loop_frame_info.lineno) @@ -241,7 +255,7 @@ def sorting_function(candidate): elif isinstance(candidate, ast.While): assert isinstance(candidate.test, ast.Call) return WhileLoop(loop_node_ast, candidate.test, get_loop_id(candidate)) - raise Exception("Unable to find reloading loop node.") + raise ReloadingException("No loop node found.") def get_loop_id(ast_node: Union[ast.For, ast.While]) -> str: @@ -264,7 +278,7 @@ def get_loop_code(loop_frame_info: inspect.FrameInfo, return get_loop_object( loop_frame_info, reloaded_file_ast, loop_id=loop_id ) - except LookupError: + except (LookupError, ReloadingException): handle_exception(filepath) @@ -278,7 +292,7 @@ def handle_exception(filepath: str): if sys.stdin.isatty(): print( - f"An error occurred. Please edit the file '{filepath}' to fix" + f"An error occurred. Please edit the file '{filepath}' to fix " "the issue and press return to continue or Ctrl+C to exit." ) try: @@ -421,9 +435,9 @@ def _reloading_loop(seq: Union[Iterable, bool]) -> Iterable: variables = ", ".join( f'"{k}"' for k in loop_frame_info.frame.f_locals.keys()) log.warning(f"Variable(s) {variables} in reloaded loop were not " - "exported to the scope which called the reloaded loop at " - f'line {loop_frame_info.lineno} in file ' - f'"{loop_frame_info.filename}".') + "exported to the scope which called the reloaded loop " + f'initially defined at line {loop_frame_info.lineno} in ' + f'file "{loop_frame_info.filename}".') return [] @@ -459,8 +473,7 @@ def strip_reloading_decorator(function_with_decorator: ast.FunctionDef): def isolate_function_def(function_frame_info: inspect.FrameInfo, function: Callable, - reloaded_file_ast: ast.Module) -> Union[None, - ast.Module]: + reloaded_file_ast: ast.Module) -> ast.Module: """ Traverse AST for the entire reloaded file in a search for the function (minus the reloading decorator) which is reloaded. @@ -497,29 +510,23 @@ def sorting_function(candidate): function_node_ast.body = [function_node] return function_node_ast else: - log.error(f'Unable to reload function "{function_name}" with ' - f'in file {function_frame_info.filename}. ' - 'The function might have been renamed or the ' - 'decorator might have been removed.') - return None - - -def get_function_def_code(function_frame_info: inspect.FrameInfo, - function: Callable) -> Union[None, ast.Module]: - reloaded_file_ast: ast.Module = parse_file_until_successful( - function_frame_info.filename) - return isolate_function_def(function_frame_info, - function, - reloaded_file_ast) + raise ReloadingException( + f'Unable to reload function "{function_name}" ' + f'in file "{function_frame_info.filename}". ' + 'The function might have been renamed or the ' + 'decorator might have been removed.' + ) def get_reloaded_function(caller_globals: Dict[str, Any], caller_locals: Dict[str, Any], function_frame_info: inspect.FrameInfo, - function: Callable) -> Union[None, Callable]: - function_ast = get_function_def_code(function_frame_info, function) - if function_ast is None: - return None + function: Callable) -> Callable: + reloaded_file_ast: ast.Module = parse_file_until_successful( + function_frame_info.filename) + function_ast = isolate_function_def(function_frame_info, + function, + reloaded_file_ast) # Copy locals to avoid exec overwriting the decorated function with the new # undecorated function. caller_locals_copy = caller_locals.copy() @@ -557,20 +564,14 @@ def wrapped(*args, **kwargs): log.info(f'Function "{function.__name__}" at line ' f'{function_frame_info.lineno} ' f'of file "{filepath}" has been reloaded.') - rfunction = ( - get_reloaded_function(caller_globals, - caller_locals, - function_frame_info, - function) - or rfunction - ) + rfunction = get_reloaded_function(caller_globals, + caller_locals, + function_frame_info, + function) file_stat = os.stat(filepath).st_mtime_ns i += 1 while True: try: - assert rfunction is not None, ( - 'Unable to load function "{function.__name__}" at line ' - f'{function_frame_info.lineno} of file "{filepath}".') result = rfunction(*args, **kwargs) return result except Exception: diff --git a/reloading/test_reloading.py b/reloading/test_reloading.py index 99b56ba..d2edb92 100644 --- a/reloading/test_reloading.py +++ b/reloading/test_reloading.py @@ -75,14 +75,32 @@ def test_complex_iteration_variables(self): self.assertEqual(i, 10) self.assertEqual(j, 9) + def test_empty_iterator(self): + i = 0 + for _ in reloading([]): + i += 1 + + if sys.version_info.major >= 3 and sys.version_info.minor >= 13: + self.assertEqual(i, 0) + class TestReloadingWhileLoopWithoutChanges(unittest.TestCase): + def test_no_argument(self): + i = 0 + # reloading() returns an empty sequence + while reloading(): + i += 1 + + if sys.version_info.major >= 3 and sys.version_info.minor >= 13: + self.assertEqual(i, 0) + def test_false(self): i = 0 while reloading(False): i += 1 - self.assertEqual(i, 0) + if sys.version_info.major >= 3 and sys.version_info.minor >= 13: + self.assertEqual(i, 0) def test_true_break(self): i = 0 From abc9ccdcf640f2eb9c2cb47545f976b5615837d7 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Thu, 19 Dec 2024 11:09:21 +0100 Subject: [PATCH 24/65] Refactor replacement of break and continue --- reloading/reloading.py | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/reloading/reloading.py b/reloading/reloading.py index 4ba6956..ee38355 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -167,6 +167,16 @@ def parse_file_until_successful(filepath: str) -> ast.Module: source = load_file(filepath) +def replace_break_continue(ast_module: ast.Module): + # Replace "break" and "continue" with custom exceptions. + # Otherwise SyntaxError is raised because these instructions + # are called outside a loop. + code = ast.unparse(ast_module) + code = code.replace("break", "raise Exception('break')") + code = code.replace("continue", "raise Exception('continue')") + return compile(code, filename="", mode="exec") + + class WhileLoop: """ Object to hold ast and test-function for a reloading while loop. @@ -175,14 +185,7 @@ def __init__(self, ast_module: ast.Module, test: ast.Call, id: str): self.ast: ast.Module = ast_module self.test: ast.Call = test self.id: str = id - # Replace "break" and "continue" with custom exceptions. - # Otherwise SyntaxError is raised because these instructions - # are called outside a loop. - code = ast.unparse(ast_module) - code = code.replace("break", "raise Exception('break')") - code = code.replace("continue", "raise Exception('continue')") - # Compile loop body - self.compiled_body = compile(code, filename="", mode="exec") + self.compiled_body = replace_break_continue(self.ast) class ForLoop: @@ -202,14 +205,7 @@ def __init__(self, self.iteration_variables_str: str = format_iteration_variables( iteration_variables) self.id: str = id - # Replace "break" and "continue" with custom exceptions. - # Otherwise SyntaxError is raised because these instructions - # are called outside a loop. - code = ast.unparse(ast_module) - code = code.replace("break", "raise Exception('break')") - code = code.replace("continue", "raise Exception('continue')") - # Compile loop body - self.compiled_body = compile(code, filename="", mode="exec") + self.compiled_body = replace_break_continue(self.ast) def get_loop_object(loop_frame_info: inspect.FrameInfo, From afc10e55082f5a48e0bf2bcf556585cb47233498 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Thu, 19 Dec 2024 22:08:53 +0100 Subject: [PATCH 25/65] Support more Python versions by avoiding ast.unparse Improve performance. --- .github/workflows/python-testing.yml | 6 +- pyproject.toml | 5 +- reloading/reloading.py | 91 ++++++++++++++++------------ reloading/test_reloading.py | 5 +- 4 files changed, 63 insertions(+), 44 deletions(-) diff --git a/.github/workflows/python-testing.yml b/.github/workflows/python-testing.yml index 163b97e..dd1b101 100644 --- a/.github/workflows/python-testing.yml +++ b/.github/workflows/python-testing.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.9.20", "3.10.15", "3.11.11", "3.12.8", "3.13.1"] + python-version: ["3.7.17", "3.8.18", "3.9.20", "3.10.15", "3.11.11", "3.12.8", "3.13.1"] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} @@ -20,8 +20,8 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install dependencies run: python -m pip install --upgrade pip - - name: Install reloading (as editable) - run: pip install -e ".[development]" + - name: Install reloading + run: pip install ".[development]" - name: Lint with flake8. Stop if syntax errors or undefined variables. run: | cd reloading diff --git a/pyproject.toml b/pyproject.toml index 83b2214..b952d82 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ build-backend = "flit_core.buildapi" [project] name = "reloading" dependencies = [] -requires-python = ">=3.9" +requires-python = ">=3.6" authors = [{name = "Julian Vossen", email = "pypi@julianvossen.de"}] maintainers = [{name = "Eskild Schroll-Fleischer", email = "eyfl@novonordisk.com"}] version="1.2.0" @@ -19,6 +19,9 @@ classifiers=[ "Topic :: Utilities", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", diff --git a/reloading/reloading.py b/reloading/reloading.py index ee38355..8214b4a 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -13,7 +13,6 @@ overload) from itertools import chain from functools import partial, update_wrapper -from copy import deepcopy import logging log = logging.getLogger("reloading") @@ -167,14 +166,26 @@ def parse_file_until_successful(filepath: str) -> ast.Module: source = load_file(filepath) +break_ast = ast.parse('raise Exception("break")').body +continue_ast = ast.parse('raise Exception("continue")').body + + +class ReplaceBreakContineWithExceptions(ast.NodeTransformer): + def visit_Break(self, node): + return break_ast + + def visit_Continue(self, node): + return continue_ast + + def replace_break_continue(ast_module: ast.Module): # Replace "break" and "continue" with custom exceptions. # Otherwise SyntaxError is raised because these instructions # are called outside a loop. - code = ast.unparse(ast_module) - code = code.replace("break", "raise Exception('break')") - code = code.replace("continue", "raise Exception('continue')") - return compile(code, filename="", mode="exec") + transformer = ReplaceBreakContineWithExceptions() + transformed_ast_module = transformer.visit(ast_module) + ast.fix_missing_locations(transformed_ast_module) + return compile(transformed_ast_module, filename="", mode="exec") class WhileLoop: @@ -186,6 +197,13 @@ def __init__(self, ast_module: ast.Module, test: ast.Call, id: str): self.test: ast.Call = test self.id: str = id self.compiled_body = replace_break_continue(self.ast) + # If no argument was supplied, then loop forever + ast_condition = ast.Expression(body=ast.Constant(True)) + if len(test.args) > 0: + # Create expression to evaluate condition + ast_condition = ast.Expression(body=test.args[0]) + ast.fix_missing_locations(ast_condition) + self.condition = compile(ast_condition, filename="", mode="eval") class ForLoop: @@ -242,9 +260,7 @@ def get_loop_object(loop_frame_info: inspect.FrameInfo, def sorting_function(candidate): return abs(candidate.lineno - loop_frame_info.lineno) candidate = min(candidates, key=sorting_function) - # Use reloaded_file_ast as template. - loop_node_ast = deepcopy(reloaded_file_ast) - loop_node_ast.body = candidate.body + loop_node_ast = ast.Module(candidate.body, type_ignores=[]) if isinstance(candidate, ast.For): assert isinstance(candidate.target, (ast.Name, ast.Tuple, ast.List)) return ForLoop(loop_node_ast, candidate.target, get_loop_id(candidate)) @@ -311,7 +327,10 @@ def execute_for_loop(seq: Iterable, loop_frame_info: inspect.FrameInfo): caller_globals: Dict[str, Any] = loop_frame_info.frame.f_globals caller_locals: Dict[str, Any] = loop_frame_info.frame.f_locals - file_stat: int = os.stat(filepath).st_mtime_ns + # Initialize variables + file_stat: int = 0 + vacant_variable_name: str = "" + assign_compiled = compile('', filename='', mode='exec') for_loop = get_loop_code( loop_frame_info, loop_id=None ) @@ -319,22 +338,29 @@ def execute_for_loop(seq: Iterable, loop_frame_info: inspect.FrameInfo): for i, iteration_variable_values in enumerate(seq): # Reload code if possibly modified if file_stat != os.stat(filepath).st_mtime_ns: - log.info(f'For loop at line {loop_frame_info.lineno} of file ' - f'"{filepath}" has been reloaded.') + if i > 0: + log.info(f'For loop at line {loop_frame_info.lineno} of file ' + f'"{filepath}" has been reloaded.') for_loop = get_loop_code( loop_frame_info, loop_id=for_loop.id ) + assert isinstance(for_loop, ForLoop) file_stat = os.stat(filepath).st_mtime_ns - assert isinstance(for_loop, ForLoop) - # Make up a name for a variable which is not already present in - # the global or local namespace. - vacant_variable_name: str = unique_name(chain(caller_locals.keys(), - caller_globals.keys())) + # Make up a name for a variable which is not already present in + # the global or local namespace. + vacant_variable_name = unique_name( + chain(caller_locals.keys(), caller_globals.keys()) + ) + # Reassign variable values from vacant variable in local scope + assign = ast.Module([ + ast.Assign(targets=[for_loop.iteration_variables], + value=ast.Name(vacant_variable_name, ast.Load()))], + type_ignores=[]) + ast.fix_missing_locations(assign) + assign_compiled = compile(assign, filename='', mode='exec') # Store iteration variable values in vacant variable in local scope caller_locals[vacant_variable_name] = iteration_variable_values - # Reassign variable values from vacant variable in local scope - exec(for_loop.iteration_variables_str + " = " + vacant_variable_name, - caller_globals, caller_locals) + exec(assign_compiled, caller_globals, caller_locals) # Clean up namespace del caller_locals[vacant_variable_name] try: @@ -362,15 +388,7 @@ def execute_while_loop(loop_frame_info: inspect.FrameInfo): ) def condition(while_loop): - test = ast.unparse(while_loop.test).replace("reloading", "") - # Make up a name for a variable which is not already present in - # the global or local namespace. - vacant_variable_name: str = unique_name(chain(caller_locals.keys(), - caller_globals.keys())) - exec(vacant_variable_name+" = "+test, caller_globals, caller_locals) - result = deepcopy(caller_locals[vacant_variable_name]) - del caller_locals[vacant_variable_name] - return result + return eval(while_loop.condition, caller_globals, caller_locals) i = 0 while condition(while_loop): @@ -453,16 +471,14 @@ def strip_reloading_decorator(function_with_decorator: ast.FunctionDef): Remove the 'reloading' decorator and all decorators before it. """ # Create shorthand for readability - fwd = function_with_decorator - # Find decorators + fwod = function_with_decorator + # Find decorator names decorator_names = [get_decorator_name_or_none(decorator) for decorator - in fwd.decorator_list] - # Find index of "reloading" decorator - reloading_index = decorator_names.index("reloading") - # Use function with decorator as template - fwod = deepcopy(fwd) - fwod.decorator_list = fwd.decorator_list[reloading_index + 1:] + in fwod.decorator_list] + fwod.decorator_list = [decorator for decorator, name + in zip(fwod.decorator_list, decorator_names) + if name != "reloading"] function_without_decorator = fwod return function_without_decorator @@ -502,8 +518,7 @@ def sorting_function(candidate): return abs(candidate.lineno - function_frame_info.lineno) candidate = min(candidates, key=sorting_function) function_node = strip_reloading_decorator(candidate) - function_node_ast = deepcopy(reloaded_file_ast) - function_node_ast.body = [function_node] + function_node_ast = ast.Module([function_node], type_ignores=[]) return function_node_ast else: raise ReloadingException( diff --git a/reloading/test_reloading.py b/reloading/test_reloading.py index d2edb92..1b77028 100644 --- a/reloading/test_reloading.py +++ b/reloading/test_reloading.py @@ -87,12 +87,13 @@ def test_empty_iterator(self): class TestReloadingWhileLoopWithoutChanges(unittest.TestCase): def test_no_argument(self): i = 0 - # reloading() returns an empty sequence while reloading(): i += 1 + if i == 10: + break if sys.version_info.major >= 3 and sys.version_info.minor >= 13: - self.assertEqual(i, 0) + self.assertEqual(i, 10) def test_false(self): i = 0 From 6b64d94a1f512f0a9d92b568acc0d6dda5f2f422 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Thu, 19 Dec 2024 22:12:37 +0100 Subject: [PATCH 26/65] Fix CI --- .github/workflows/python-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-testing.yml b/.github/workflows/python-testing.yml index dd1b101..e651623 100644 --- a/.github/workflows/python-testing.yml +++ b/.github/workflows/python-testing.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.7.17", "3.8.18", "3.9.20", "3.10.15", "3.11.11", "3.12.8", "3.13.1"] + python-version: ["3.8.18", "3.9.20", "3.10.15", "3.11.11", "3.12.8", "3.13.1"] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} From a9fd696b992fda0146034b4ef12c058b12995116 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Thu, 19 Dec 2024 22:29:53 +0100 Subject: [PATCH 27/65] Fix possible race condition. Harmonize naming. --- reloading/reloading.py | 63 ++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/reloading/reloading.py b/reloading/reloading.py index 8214b4a..14c3d04 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -139,31 +139,31 @@ def format_iteration_variables(ast_node: Union[ast.Name, return ", ".join(names) -def load_file(filepath: str) -> str: +def load_file(filename: str) -> str: """ Read contents of file containing reloading code. Handle case of file appearing empty on read. """ while True: - with open(filepath, "r") as f: + with open(filename, "r") as f: src = f.read() if len(src): return src + "\n" -def parse_file_until_successful(filepath: str) -> ast.Module: +def parse_file_until_successful(filename: str) -> ast.Module: """ Parse source code of file containing reloading code. File may appear incomplete as as it is read so retry until successful. """ - source = load_file(filepath) + source = load_file(filename) while True: try: tree = ast.parse(source) return tree except SyntaxError: - handle_exception(filepath) - source = load_file(filepath) + handle_exception(filename) + source = load_file(filename) break_ast = ast.parse('raise Exception("break")').body @@ -283,28 +283,28 @@ def get_loop_id(ast_node: Union[ast.For, ast.While]) -> str: def get_loop_code(loop_frame_info: inspect.FrameInfo, loop_id: Union[None, str]) -> Union[WhileLoop, ForLoop]: - filepath: str = loop_frame_info.filename + filename: str = loop_frame_info.filename while True: - reloaded_file_ast: ast.Module = parse_file_until_successful(filepath) + reloaded_file_ast: ast.Module = parse_file_until_successful(filename) try: return get_loop_object( loop_frame_info, reloaded_file_ast, loop_id=loop_id ) except (LookupError, ReloadingException): - handle_exception(filepath) + handle_exception(filename) -def handle_exception(filepath: str): +def handle_exception(filename: str): """ Output helpful error message to user regarding exception in reloaded code. """ exception = traceback.format_exc() - exception = exception.replace('File ""', f'File "{filepath}"') + exception = exception.replace('File ""', f'File "{filename}"') sys.stderr.write(exception + "\n") if sys.stdin.isatty(): print( - f"An error occurred. Please edit the file '{filepath}' to fix " + f"An error occurred. Please edit the file '{filename}' to fix " "the issue and press return to continue or Ctrl+C to exit." ) try: @@ -318,12 +318,12 @@ def handle_exception(filepath: str): print(line_number) raise Exception( 'An error occurred. Please fix the issue in the file' - f'"{filepath}" and run the script again.' + f'"{filename}" and run the script again.' ) def execute_for_loop(seq: Iterable, loop_frame_info: inspect.FrameInfo): - filepath = loop_frame_info.filename + filename = loop_frame_info.filename caller_globals: Dict[str, Any] = loop_frame_info.frame.f_globals caller_locals: Dict[str, Any] = loop_frame_info.frame.f_locals @@ -337,15 +337,16 @@ def execute_for_loop(seq: Iterable, loop_frame_info: inspect.FrameInfo): for i, iteration_variable_values in enumerate(seq): # Reload code if possibly modified - if file_stat != os.stat(filepath).st_mtime_ns: + file_stat_: int = os.stat(filename).st_mtime_ns + if file_stat != file_stat_: if i > 0: log.info(f'For loop at line {loop_frame_info.lineno} of file ' - f'"{filepath}" has been reloaded.') + f'"{filename}" has been reloaded.') for_loop = get_loop_code( loop_frame_info, loop_id=for_loop.id ) assert isinstance(for_loop, ForLoop) - file_stat = os.stat(filepath).st_mtime_ns + file_stat = file_stat_ # Make up a name for a variable which is not already present in # the global or local namespace. vacant_variable_name = unique_name( @@ -374,15 +375,15 @@ def execute_for_loop(seq: Iterable, loop_frame_info: inspect.FrameInfo): if exception.args == ("continue",): continue else: - handle_exception(filepath) + handle_exception(filename) def execute_while_loop(loop_frame_info: inspect.FrameInfo): - filepath = loop_frame_info.filename + filename = loop_frame_info.filename caller_globals: Dict[str, Any] = loop_frame_info.frame.f_globals caller_locals: Dict[str, Any] = loop_frame_info.frame.f_locals - file_stat: int = os.stat(filepath).st_mtime_ns + file_stat: int = os.stat(filename).st_mtime_ns while_loop = get_loop_code( loop_frame_info, loop_id=None ) @@ -394,13 +395,14 @@ def condition(while_loop): while condition(while_loop): i += 1 # Reload code if possibly modified - if file_stat != os.stat(filepath).st_mtime_ns: + file_stat_: int = os.stat(filename).st_mtime_ns + if file_stat != file_stat_: log.info(f'While loop at line {loop_frame_info.lineno} of file ' - f'"{filepath}" has been reloaded.') + f'"{filename}" has been reloaded.') while_loop = get_loop_code( loop_frame_info, loop_id=while_loop.id ) - file_stat = os.stat(filepath).st_mtime_ns + file_stat = file_stat_ try: exec(while_loop.compiled_body, caller_globals, caller_locals) except Exception as exception: @@ -412,7 +414,7 @@ def condition(while_loop): if exception.args == ("continue",): continue else: - handle_exception(filepath) + handle_exception(filename) def _reloading_loop(seq: Union[Iterable, bool]) -> Iterable: @@ -556,12 +558,12 @@ def _reloading_function(function: Callable) -> Callable: assert stack[1].function == "reloading" # The third element is the loop which called reloading. function_frame_info: inspect.FrameInfo = stack[2] - filepath: str = function_frame_info.filename + filename: str = function_frame_info.filename caller_globals = function_frame_info.frame.f_globals caller_locals = function_frame_info.frame.f_locals - file_stat: int = os.stat(filepath).st_mtime_ns + file_stat: int = os.stat(filename).st_mtime_ns rfunction = get_reloaded_function(caller_globals, caller_locals, function_frame_info, @@ -571,22 +573,23 @@ def _reloading_function(function: Callable) -> Callable: def wrapped(*args, **kwargs): nonlocal file_stat, function, rfunction, i # Reload code if possibly modified - if file_stat != os.stat(filepath).st_mtime_ns: + file_stat_: int = os.stat(filename).st_mtime_ns + if file_stat != file_stat_: log.info(f'Function "{function.__name__}" at line ' f'{function_frame_info.lineno} ' - f'of file "{filepath}" has been reloaded.') + f'of file "{filename}" has been reloaded.') rfunction = get_reloaded_function(caller_globals, caller_locals, function_frame_info, function) - file_stat = os.stat(filepath).st_mtime_ns + file_stat = file_stat_ i += 1 while True: try: result = rfunction(*args, **kwargs) return result except Exception: - handle_exception(filepath) + handle_exception(filename) wrapped.__signature__ = inspect.signature(function) # type: ignore caller_locals[function.__name__] = wrapped From 4d6efa654a926fb4f1346fe4b87fe7f02da5bf15 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Thu, 19 Dec 2024 22:38:34 +0100 Subject: [PATCH 28/65] Add download URL. --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index b952d82..821a9e8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,6 +31,7 @@ classifiers=[ [project.urls] Repository = "https://github.com/eskildsf/reloading" +DOWNLOAD = "https://github.com/nneskildsf/reloading/archive/refs/heads/master.zip" [project.optional-dependencies] development = [ From 51a5d7858db009fd6ec4843f1be1d84e9494245a Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Fri, 20 Dec 2024 08:49:03 +0100 Subject: [PATCH 29/65] Update readme --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 357edc5..24f0a46 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,16 @@ This is a fork of https://github.com/julvo/reloading with the following improvements: * Typing (pyright compliance) -* Linting (flak8 compliance) +* Linting (flak8e compliance) * Expanded test suite * Supports multiple invocations of `reloading` in a single file * Supports `while` loop +* Supports `continue` and `break` in loops +* Improved performance (Reloaded `while` and `for` loops are only about 40 times slower than regular) * Preserves function signature for functions decorated with `@reloading` * CI with Github Actions workflow * Reload code only if source code file has been changed * With Python 3.13: Exports locals of reloaded loop to parent locals +* Improved error handling # Reloading A Python utility to reload a function or loop body from source on each iteration without losing state. From b1b45a5eed055109482c94465c33e5eac021dc8c Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Fri, 20 Dec 2024 09:23:26 +0100 Subject: [PATCH 30/65] Throw exception if used in interactive environment. --- reloading/reloading.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/reloading/reloading.py b/reloading/reloading.py index 14c3d04..7c090af 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -34,6 +34,10 @@ def __iter__(self): ) +def is_interactive(): + return hasattr(sys, "ps1") + + class ReloadingException(Exception): pass @@ -81,6 +85,9 @@ def reloading(fn_or_seq_or_bool: Optional[ A function, iterator or condition which should be reloaded from source before each invocation or iteration, respectively. """ + if is_interactive(): + raise Exception('Reloading cannot be used in interactive ' + 'prompt or IPython.') if fn_or_seq_or_bool is not None: if isinstance(fn_or_seq_or_bool, Callable): return _reloading_function(fn_or_seq_or_bool) From 3eed0384801eeb984ed36e886fa38e783e5b1123 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Fri, 20 Dec 2024 15:02:21 +0100 Subject: [PATCH 31/65] Fix regression. Add test case for decorated function. --- reloading/reloading.py | 9 ++++++--- reloading/test_reloading.py | 13 +++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/reloading/reloading.py b/reloading/reloading.py index 7c090af..f0b5265 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -433,6 +433,8 @@ def _reloading_loop(seq: Union[Iterable, bool]) -> Iterable: assert stack[1].function == "reloading" # The third element is the loop which called reloading. loop_frame_info: inspect.FrameInfo = stack[2] + # Replace filename with Jupyter Notebook file name + # if we are in a Jupyter Notebook session. loop_object = get_loop_code( loop_frame_info, loop_id=None ) @@ -442,6 +444,7 @@ def _reloading_loop(seq: Union[Iterable, bool]) -> Iterable: execute_for_loop(seq, loop_frame_info) elif isinstance(loop_object, WhileLoop): execute_while_loop(loop_frame_info) + # If there is a third element, then it is the scope which called the loop. # It is only possible to modify variables in this scope since Python 3.13. if (len(stack) > 3 and @@ -485,9 +488,9 @@ def strip_reloading_decorator(function_with_decorator: ast.FunctionDef): decorator_names = [get_decorator_name_or_none(decorator) for decorator in fwod.decorator_list] - fwod.decorator_list = [decorator for decorator, name - in zip(fwod.decorator_list, decorator_names) - if name != "reloading"] + # Find index of "reloading" decorator + reloading_index = decorator_names.index("reloading") + fwod.decorator_list = fwod.decorator_list[reloading_index + 1:] function_without_decorator = fwod return function_without_decorator diff --git a/reloading/test_reloading.py b/reloading/test_reloading.py index 1b77028..2f4482a 100644 --- a/reloading/test_reloading.py +++ b/reloading/test_reloading.py @@ -173,6 +173,19 @@ def some_func(a, b, c): import inspect self.assertEqual(str(inspect.signature(some_func)), "(a, b, c)") + def test_decorated_function(self): + def decorator(f): + def wrap(): + return "<"+str(f())+">" + return wrap + + @decorator + @reloading + def f(): + return 2 + + self.assertEqual(f(), "<2>") + class TestReloadingForLoopWithChanges(unittest.TestCase): def test_changing_source_loop(self): From 06e1a81f8b72f73c07fb0dec8ecba570ace057e5 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Fri, 20 Dec 2024 19:35:14 +0100 Subject: [PATCH 32/65] Rename CI action. --- .github/workflows/{python-testing.yml => CI.yml} | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) rename .github/workflows/{python-testing.yml => CI.yml} (63%) diff --git a/.github/workflows/python-testing.yml b/.github/workflows/CI.yml similarity index 63% rename from .github/workflows/python-testing.yml rename to .github/workflows/CI.yml index e651623..c8cec95 100644 --- a/.github/workflows/python-testing.yml +++ b/.github/workflows/CI.yml @@ -1,4 +1,4 @@ -name: Python application +name: CI on: push: @@ -22,16 +22,8 @@ jobs: run: python -m pip install --upgrade pip - name: Install reloading run: pip install ".[development]" - - name: Lint with flake8. Stop if syntax errors or undefined variables. - run: | - cd reloading - flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics - - name: Lint with flake8. Get warnings. - run: | - cd reloading - if ! flake8 . --count --statistics; then - echo "::warning::Flake8 Lint Warning" - fi + - name: Lint with flake8 + run: flake8 - name: Type check with pyright run: pyright - name: Test with unittest From a8bbfa4437eea1f5706f88c5eba4f0a32d8d3710 Mon Sep 17 00:00:00 2001 From: nneskildsf <54531016+nneskildsf@users.noreply.github.com> Date: Fri, 20 Dec 2024 20:28:02 +0100 Subject: [PATCH 33/65] Update README.md --- README.md | 50 ++++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 24f0a46..2bc91c8 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,31 @@ -This is a fork of https://github.com/julvo/reloading with the following improvements: -* Typing (pyright compliance) -* Linting (flak8e compliance) -* Expanded test suite -* Supports multiple invocations of `reloading` in a single file -* Supports `while` loop -* Supports `continue` and `break` in loops -* Improved performance (Reloaded `while` and `for` loops are only about 40 times slower than regular) -* Preserves function signature for functions decorated with `@reloading` -* CI with Github Actions workflow -* Reload code only if source code file has been changed -* With Python 3.13: Exports locals of reloaded loop to parent locals -* Improved error handling - # Reloading +[![CI](https://github.com/nneskildsf/reloading/actions/workflows/CI.yml/badge.svg)](https://github.com/nneskildsf/reloading/actions/workflows/CI.yml) + A Python utility to reload a function or loop body from source on each iteration without losing state. -## Install -``` -pip install git+https://github.com/nneskildsf/reloading.git -``` -or if you do not have Git -``` -pip install https://github.com/nneskildsf/reloading/archive/refs/heads/master.zip +## Installing Reloading and Supported Versions +This fork of reloading is *not* available on PyPi. Install it from Github: +```console +$ pip install https://github.com/nneskildsf/reloading/archive/refs/heads/master.zip ``` +This fork of reloading supports Python 3.6+. + +## Supported Features +- Reload functions, `for` loops and `while` loops +- `break` and `continue` in loops +- Multiple reloading functions and loops in one file +- Reloaded functions preserve their original call signature +- Only reload source code when changed for faster performance +- Comprehensive exceptions and logging to let you know of errors +- Exports locals of reloaded loops to parent locals (Python 3.13 and newer) + +## Not Supported +- Use of reloading in Jupyter Notebooks and IPython + ## Usage +### For Loop To reload the body of a `for` loop from source before each iteration, wrap the iterator with `reloading`: ```python from reloading import reloading @@ -35,6 +35,7 @@ for i in reloading(range(10)): print(i) ``` +### While Loop To reload the body and condition of a `while` loop from source before each iteration, wrap the condition with `reloading`: ```python from reloading import reloading @@ -46,6 +47,7 @@ while reloading(i<10): i += 1 ``` +### Function To reload a function from source before each execution, decorate the function definition with `@reloading`: ```python @@ -70,7 +72,7 @@ for _ in reloading(): ## Known Issus -On Python version less than 3.13 it is not possible to properly export the local variables from a loop to parent locals. The following example demonstrates this: +On Python version [less than 3.13](https://docs.python.org/3/reference/datamodel.html#frame.f_locals) it is not possible to properly export the local variables from a loop to parent locals. The following example demonstrates this: ```python from reloading import reloading @@ -80,14 +82,14 @@ def function(): i += 1 print(i) -function() # Prints 0. Not 10 as expected. +function() # Prints 0. Not 10 as expected. Fixed in Python 3.13. ``` A warning is emitted when the issue arises: `WARNING:reloading:Variable(s) "i" in reloaded loop were not exported to the scope which called the reloaded loop at line...`. ## Lint, Type Check and Testing Run: -``` +```console $ pip install -e ".[development]" $ flake8 $ pyright From 5ad89a15d193d4e34bad7e799130dbba0e366918 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Fri, 20 Dec 2024 21:09:22 +0100 Subject: [PATCH 34/65] Add test cases. --- reloading/test_reloading.py | 152 +++++++++++++++++++++++++++++++++++- 1 file changed, 151 insertions(+), 1 deletion(-) diff --git a/reloading/test_reloading.py b/reloading/test_reloading.py index 2f4482a..4814eb7 100644 --- a/reloading/test_reloading.py +++ b/reloading/test_reloading.py @@ -83,6 +83,21 @@ def test_empty_iterator(self): if sys.version_info.major >= 3 and sys.version_info.minor >= 13: self.assertEqual(i, 0) + def test_use_outside_loop(self): + with self.assertRaises(Exception): + reloading(range(10)) + + def test_continue(self): + j = 0 + for i in range(10): + i += 1 + if i > 5: + continue + j = i + + self.assertEqual(i, 10) + self.assertEqual(j, 5) + class TestReloadingWhileLoopWithoutChanges(unittest.TestCase): def test_no_argument(self): @@ -135,6 +150,22 @@ def test_condition(self): self.assertEqual(i, 10) + def test_use_outside_loop(self): + with self.assertRaises(Exception): + reloading(True) + + def test_continue(self): + i = 0 + j = 0 + while i < 10: + i += 1 + if i > 5: + continue + j = i + + self.assertEqual(i, 10) + self.assertEqual(j, 5) + class TestReloadingFunctionWithoutChanges(unittest.TestCase): def test_empty_function_definition(self): @@ -331,6 +362,28 @@ def test_nested_loop(self): self.assertIn("AB", stdout) self.assertIn("AC", stdout) + def test_function_in_loop(self): + code = """ +from reloading import reloading +from time import sleep + +def f(): + return 'f' + +for i in reloading(range(10)): + print(f()+'g') + sleep(0.2) +""" + stdout, stderr = run_and_update_source( + init_src=code, + updated_src=code.replace("'f'", "'F'"). + replace("'g'", "'G'"), + ) + + self.assertIn("fg", stdout) + self.assertIn("fG", stdout) + self.assertNotIn("FG", stdout) + class TestReloadingWhileLoopWithChanges(unittest.TestCase): def test_changing_source_loop(self): @@ -351,6 +404,30 @@ def test_changing_source_loop(self): max_i = stdout.strip().split("\n")[-1] self.assertEqual(max_i, "9") + def test_function_in_loop(self): + code = """ +from reloading import reloading +from time import sleep + +def f(): + return 'f' + +i = 0 +while reloading(i<10): + print(f()+'g') + sleep(0.2) + i += 1 +""" + stdout, stderr = run_and_update_source( + init_src=code, + updated_src=code.replace("'f'", "'F'"). + replace("'g'", "'G'"), + ) + + self.assertIn("fg", stdout) + self.assertIn("fG", stdout) + self.assertNotIn("FG", stdout) + class TestReloadingFunctionsWithChanges(unittest.TestCase): def test_changing_source_function(self): @@ -420,6 +497,79 @@ def inner(x): self.assertIn("AB", stdout) self.assertIn("AC", stdout) + def test_multiple_function(self): + code = """ +from reloading import reloading +from time import sleep + +@reloading +def f(): + return 'f' + +@reloading +def g(): + return 'g' + +for i in range(10): + print(f()+g()) + sleep(0.2) +""" + stdout, _ = run_and_update_source( + init_src=code, + updated_src=code.replace("'f'", "'F'"). + replace("'g'", "'G'"), + ) + + self.assertIn("fg", stdout) + self.assertIn("FG", stdout) + + +class TestReloadingMixedWithChanges(unittest.TestCase): + def test_function_for_loop(self): + code = """ +from reloading import reloading +from time import sleep + +@reloading +def f(): + return 'f' + +for i in reloading(range(10)): + print(f()+'g') + sleep(0.2) +""" + stdout, stderr = run_and_update_source( + init_src=code, + updated_src=code.replace("'f'", "'F'"). + replace("'g'", "'G'"), + ) + + self.assertIn("fg", stdout) + self.assertIn("FG", stdout) + + def test_function_while_loop(self): + code = """ +from reloading import reloading +from time import sleep + +@reloading +def f(): + return 'f' + +i = 0 +while reloading(i<10): + print(f()+'g') + sleep(0.2) + i += 1 +""" + stdout, stderr = run_and_update_source( + init_src=code, + updated_src=code.replace("'f'", "'F'"). + replace("'g'", "'G'"), + ) + + self.assertIn("fg", stdout) + self.assertIn("FG", stdout) if __name__ == "__main__": - unittest.main() + unittest.main(verbosity=2) From b790d90b7f7183ebded8ccc1fbfeee90cd5d9fc7 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Fri, 20 Dec 2024 21:12:22 +0100 Subject: [PATCH 35/65] Fix flake8. --- reloading/test_reloading.py | 1 + 1 file changed, 1 insertion(+) diff --git a/reloading/test_reloading.py b/reloading/test_reloading.py index 4814eb7..18274bc 100644 --- a/reloading/test_reloading.py +++ b/reloading/test_reloading.py @@ -571,5 +571,6 @@ def f(): self.assertIn("fg", stdout) self.assertIn("FG", stdout) + if __name__ == "__main__": unittest.main(verbosity=2) From 1e9d15076d77846adbeeb1db08b73612c46fb65d Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Fri, 20 Dec 2024 21:17:34 +0100 Subject: [PATCH 36/65] Fix pyright. --- reloading/test_reloading.py | 1 + 1 file changed, 1 insertion(+) diff --git a/reloading/test_reloading.py b/reloading/test_reloading.py index 18274bc..009c67f 100644 --- a/reloading/test_reloading.py +++ b/reloading/test_reloading.py @@ -88,6 +88,7 @@ def test_use_outside_loop(self): reloading(range(10)) def test_continue(self): + i = 0 j = 0 for i in range(10): i += 1 From a45474899a094c58971dd856b1abd56cf4e35adf Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Sat, 21 Dec 2024 09:08:24 +0100 Subject: [PATCH 37/65] Add more Python 3 versions to CI. --- .github/workflows/CI.yml | 29 ++++++++++++++++++++++++++--- pyproject.toml | 2 +- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index c8cec95..c1fa95f 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -7,11 +7,34 @@ on: branches: [ "master" ] jobs: - test: - runs-on: ubuntu-latest + test_2004: + name: Ubuntu 20.04 - Python ${{ matrix.python }} + runs-on: ubuntu-20.04 strategy: matrix: - python-version: ["3.8.18", "3.9.20", "3.10.15", "3.11.11", "3.12.8", "3.13.1"] + python-version: ["3.5.10", "3.6.15"] + steps: + - uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: python -m pip install --upgrade pip + - name: Install reloading + run: pip install ".[development]" + - name: Lint with flake8 + run: flake8 + - name: Type check with pyright + run: pyright + - name: Test with unittest + run: python -m unittest + test_2204: + name: Ubuntu 22.04 - Python ${{ matrix.python }} + runs-on: ubuntu-22.04 + strategy: + matrix: + python-version: ["3.7.17", "3.8.18", "3.9.20", "3.10.15", "3.11.11", "3.12.8", "3.13.1"] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} diff --git a/pyproject.toml b/pyproject.toml index 821a9e8..3ecc03e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ build-backend = "flit_core.buildapi" [project] name = "reloading" dependencies = [] -requires-python = ">=3.6" +requires-python = ">=3.5" authors = [{name = "Julian Vossen", email = "pypi@julianvossen.de"}] maintainers = [{name = "Eskild Schroll-Fleischer", email = "eyfl@novonordisk.com"}] version="1.2.0" From d698f9ce5cf7100968143b66b7247846f11c342c Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Sat, 21 Dec 2024 09:11:05 +0100 Subject: [PATCH 38/65] Remove pip upgrade. --- .github/workflows/CI.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index c1fa95f..8f44c3d 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -19,10 +19,8 @@ jobs: uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - - name: Install dependencies - run: python -m pip install --upgrade pip - name: Install reloading - run: pip install ".[development]" + run: python -m pip install ".[development]" - name: Lint with flake8 run: flake8 - name: Type check with pyright @@ -41,10 +39,8 @@ jobs: uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - - name: Install dependencies - run: python -m pip install --upgrade pip - name: Install reloading - run: pip install ".[development]" + run: python -m pip install ".[development]" - name: Lint with flake8 run: flake8 - name: Type check with pyright From 176fbcd92109d3dd6db9643be71e31518bae9a05 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Sat, 21 Dec 2024 09:14:44 +0100 Subject: [PATCH 39/65] Avoid SSL error for Python 3.5 --- .github/workflows/CI.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 8f44c3d..15672be 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -19,6 +19,8 @@ jobs: uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} + env: + PIP_TRUSTED_HOST: "pypi.python.org pypi.org files.pythonhosted.org" - name: Install reloading run: python -m pip install ".[development]" - name: Lint with flake8 From d0bdaa99691d88c51f3e67483b46d0fc7604a8f0 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Sat, 21 Dec 2024 09:17:29 +0100 Subject: [PATCH 40/65] Only do tests on older Python versions. --- .github/workflows/CI.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 15672be..f845171 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -8,7 +8,7 @@ on: jobs: test_2004: - name: Ubuntu 20.04 - Python ${{ matrix.python }} + name: Ubuntu 20.04 - Python ${{ matrix.python-version }} runs-on: ubuntu-20.04 strategy: matrix: @@ -23,14 +23,10 @@ jobs: PIP_TRUSTED_HOST: "pypi.python.org pypi.org files.pythonhosted.org" - name: Install reloading run: python -m pip install ".[development]" - - name: Lint with flake8 - run: flake8 - - name: Type check with pyright - run: pyright - name: Test with unittest run: python -m unittest test_2204: - name: Ubuntu 22.04 - Python ${{ matrix.python }} + name: Ubuntu 22.04 - Python ${{ matrix.python-version }} runs-on: ubuntu-22.04 strategy: matrix: From addc0807f56a245d860fc2ca67cb947ee4cd58d3 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Sat, 21 Dec 2024 09:20:57 +0100 Subject: [PATCH 41/65] Drop Python 3.5 because of f-strings. --- .github/workflows/CI.yml | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index f845171..292e6ca 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-20.04 strategy: matrix: - python-version: ["3.5.10", "3.6.15"] + python-version: ["3.6.15"] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} diff --git a/pyproject.toml b/pyproject.toml index 3ecc03e..821a9e8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ build-backend = "flit_core.buildapi" [project] name = "reloading" dependencies = [] -requires-python = ">=3.5" +requires-python = ">=3.6" authors = [{name = "Julian Vossen", email = "pypi@julianvossen.de"}] maintainers = [{name = "Eskild Schroll-Fleischer", email = "eyfl@novonordisk.com"}] version="1.2.0" From 9d1d258007e7f29d16235fb45bde407a9653ee5f Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Sat, 21 Dec 2024 09:25:38 +0100 Subject: [PATCH 42/65] Upgrade packages when installing. --- .github/workflows/CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 292e6ca..31f38e8 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -38,7 +38,7 @@ jobs: with: python-version: ${{ matrix.python-version }} - name: Install reloading - run: python -m pip install ".[development]" + run: python -m pip install ".[development]" -U - name: Lint with flake8 run: flake8 - name: Type check with pyright From f493ac95b480b796e79479e280875331977c63b7 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Sat, 21 Dec 2024 09:28:28 +0100 Subject: [PATCH 43/65] Upgrade packages eagerly when installing. --- .github/workflows/CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 31f38e8..0ad09c1 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -38,7 +38,7 @@ jobs: with: python-version: ${{ matrix.python-version }} - name: Install reloading - run: python -m pip install ".[development]" -U + run: python -m pip install --upgrade --upgrade-strategy eager ".[development]" - name: Lint with flake8 run: flake8 - name: Type check with pyright From 1f89e8cd31269cf5ef6bea6d11a098359eb7c9e1 Mon Sep 17 00:00:00 2001 From: nneskildsf <54531016+nneskildsf@users.noreply.github.com> Date: Sat, 21 Dec 2024 09:30:34 +0100 Subject: [PATCH 44/65] Upgrade pip --- .github/workflows/CI.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 0ad09c1..f36583f 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -37,6 +37,8 @@ jobs: uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} + - name: Upgrade pip + run: python -m pip install --upgrade pip - name: Install reloading run: python -m pip install --upgrade --upgrade-strategy eager ".[development]" - name: Lint with flake8 From 958003a35308623fd9b40380ff7a459644ace282 Mon Sep 17 00:00:00 2001 From: nneskildsf <54531016+nneskildsf@users.noreply.github.com> Date: Sat, 21 Dec 2024 09:37:39 +0100 Subject: [PATCH 45/65] Only do unittest on 3.7. --- .github/workflows/CI.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index f36583f..f9374e6 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-20.04 strategy: matrix: - python-version: ["3.6.15"] + python-version: ["3.6.15", "3.7.17"] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} @@ -22,7 +22,7 @@ jobs: env: PIP_TRUSTED_HOST: "pypi.python.org pypi.org files.pythonhosted.org" - name: Install reloading - run: python -m pip install ".[development]" + run: python -m pip install . - name: Test with unittest run: python -m unittest test_2204: @@ -30,17 +30,15 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: - python-version: ["3.7.17", "3.8.18", "3.9.20", "3.10.15", "3.11.11", "3.12.8", "3.13.1"] + python-version: ["3.8.18", "3.9.20", "3.10.15", "3.11.11", "3.12.8", "3.13.1"] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - - name: Upgrade pip - run: python -m pip install --upgrade pip - name: Install reloading - run: python -m pip install --upgrade --upgrade-strategy eager ".[development]" + run: python -m pip install ".[development]" - name: Lint with flake8 run: flake8 - name: Type check with pyright From 7b32d25e7c89b85c543ed92a7bd0ab28ecaa8b93 Mon Sep 17 00:00:00 2001 From: nneskildsf <54531016+nneskildsf@users.noreply.github.com> Date: Sat, 21 Dec 2024 09:41:07 +0100 Subject: [PATCH 46/65] Be less specific about Python versions. --- .github/workflows/CI.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index f9374e6..394cd08 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-20.04 strategy: matrix: - python-version: ["3.6.15", "3.7.17"] + python-version: ["3.6", "3.7"] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} @@ -30,7 +30,7 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: - python-version: ["3.8.18", "3.9.20", "3.10.15", "3.11.11", "3.12.8", "3.13.1"] + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} From ff4aeb6ed6f2db724968ff1720c00b8878d9c1e1 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Sat, 21 Dec 2024 22:48:13 +0100 Subject: [PATCH 47/65] Support Jupyter Notebook Support reloading.reloading Fix tests Add tests --- README.md | 4 +- pyproject.toml | 1 + reloading/reloading.py | 112 ++++++++++++++++++++---------------- reloading/test_reloading.py | 32 +++++++++-- 4 files changed, 90 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index 2bc91c8..3c78623 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ This fork of reloading supports Python 3.6+. ## Supported Features - Reload functions, `for` loops and `while` loops +- Works in Jupyter Notebook - `break` and `continue` in loops - Multiple reloading functions and loops in one file - Reloaded functions preserve their original call signature @@ -20,9 +21,6 @@ This fork of reloading supports Python 3.6+. - Comprehensive exceptions and logging to let you know of errors - Exports locals of reloaded loops to parent locals (Python 3.13 and newer) -## Not Supported -- Use of reloading in Jupyter Notebooks and IPython - ## Usage ### For Loop diff --git a/pyproject.toml b/pyproject.toml index 821a9e8..1ed4521 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,6 +35,7 @@ DOWNLOAD = "https://github.com/nneskildsf/reloading/archive/refs/heads/master.zi [project.optional-dependencies] development = [ + "nbformat", "flake8", "pyright", "build", diff --git a/reloading/reloading.py b/reloading/reloading.py index f0b5265..04e6f78 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -12,32 +12,12 @@ List, overload) from itertools import chain -from functools import partial, update_wrapper import logging log = logging.getLogger("reloading") logging.basicConfig(level=logging.INFO) -class NoIterPartial(partial): - """ - Make our own partial in case someone wants to use reloading as an - iterator. Without any arguments they would get a partial back - because a call without an iterator argument is assumed to be a decorator. - Getting a "TypeError: 'functools.partial' object is not iterable" - is not really descriptive. - Hence we overwrite the iter to make sure that the error makes sense. - """ - def __iter__(self): - raise TypeError( - "Nothing to iterate over. Please pass an iterable to reloading." - ) - - -def is_interactive(): - return hasattr(sys, "ps1") - - class ReloadingException(Exception): pass @@ -85,9 +65,6 @@ def reloading(fn_or_seq_or_bool: Optional[ A function, iterator or condition which should be reloaded from source before each invocation or iteration, respectively. """ - if is_interactive(): - raise Exception('Reloading cannot be used in interactive ' - 'prompt or IPython.') if fn_or_seq_or_bool is not None: if isinstance(fn_or_seq_or_bool, Callable): return _reloading_function(fn_or_seq_or_bool) @@ -101,10 +78,6 @@ def reloading(fn_or_seq_or_bool: Optional[ ) else: return _reloading_loop(iter(int, 1)) - # return this function with the keyword arguments partialed in, - # so that the return value can be used as a decorator - decorator = update_wrapper(NoIterPartial(reloading), reloading) - return decorator def unique_name(seq: chain) -> str: @@ -151,9 +124,25 @@ def load_file(filename: str) -> str: Read contents of file containing reloading code. Handle case of file appearing empty on read. """ + src = "" while True: with open(filename, "r") as f: - src = f.read() + if filename.endswith(".ipynb"): + import nbformat + # Read Jupyter Notebook v. 4 + notebook = nbformat.read(f, 4) + # Create list of all code blocks + blocks = [cell.source for cell in notebook.cells + if cell["cell_type"] == "code"] + # Join all blocks (a block is a multiline string of code) + jupyter_code = "\n".join(blocks) + # Jupyter has a magic meaning of !. Lines which start + # with "!" are not Python code. + lines = [line.replace("!", "# !", 1) if line.startswith("!") + else line for line in jupyter_code.split("\n")] + src = "\n".join(lines) + else: + src = f.read() if len(src): return src + "\n" @@ -243,12 +232,16 @@ def get_loop_object(loop_frame_info: inspect.FrameInfo, candidates: List[Union[ast.For, ast.While]] = [] for node in ast.walk(reloaded_file_ast): if isinstance(node, ast.For) and isinstance(node.iter, ast.Call): - if getattr(node.iter.func, "id") == "reloading" and ( + # Handle "for reloading(iter)" as well as + # "for reloading.reloading(iter)". + if (getattr(node.iter.func, "id", "") == "reloading" or + getattr(node.iter.func, "attr", "") == "reloading") and ( (loop_id is not None and loop_id == get_loop_id(node)) or getattr(node, "lineno", None) == loop_frame_info.lineno): candidates.append(node) if isinstance(node, ast.While) and isinstance(node.test, ast.Call): - if getattr(node.test.func, "id") == "reloading" and ( + if (getattr(node.test.func, "id", "") == "reloading" or + getattr(node.test.func, "attr", "") == "reloading") and ( (loop_id is not None and loop_id == get_loop_id(node)) or getattr(node, "lineno", None) == loop_frame_info.lineno): candidates.append(node) @@ -289,8 +282,8 @@ def get_loop_id(ast_node: Union[ast.For, ast.While]) -> str: def get_loop_code(loop_frame_info: inspect.FrameInfo, - loop_id: Union[None, str]) -> Union[WhileLoop, ForLoop]: - filename: str = loop_frame_info.filename + loop_id: Union[None, str], + filename: str) -> Union[WhileLoop, ForLoop]: while True: reloaded_file_ast: ast.Module = parse_file_until_successful(filename) try: @@ -329,17 +322,18 @@ def handle_exception(filename: str): ) -def execute_for_loop(seq: Iterable, loop_frame_info: inspect.FrameInfo): - filename = loop_frame_info.filename +def execute_for_loop(seq: Iterable, + loop_frame_info: inspect.FrameInfo, + filename: str): caller_globals: Dict[str, Any] = loop_frame_info.frame.f_globals caller_locals: Dict[str, Any] = loop_frame_info.frame.f_locals # Initialize variables file_stat: int = 0 vacant_variable_name: str = "" - assign_compiled = compile('', filename='', mode='exec') + assign_compiled = compile("", filename="", mode="exec") for_loop = get_loop_code( - loop_frame_info, loop_id=None + loop_frame_info, loop_id=None, filename=filename ) for i, iteration_variable_values in enumerate(seq): @@ -350,7 +344,7 @@ def execute_for_loop(seq: Iterable, loop_frame_info: inspect.FrameInfo): log.info(f'For loop at line {loop_frame_info.lineno} of file ' f'"{filename}" has been reloaded.') for_loop = get_loop_code( - loop_frame_info, loop_id=for_loop.id + loop_frame_info, loop_id=for_loop.id, filename=filename ) assert isinstance(for_loop, ForLoop) file_stat = file_stat_ @@ -385,14 +379,13 @@ def execute_for_loop(seq: Iterable, loop_frame_info: inspect.FrameInfo): handle_exception(filename) -def execute_while_loop(loop_frame_info: inspect.FrameInfo): - filename = loop_frame_info.filename +def execute_while_loop(loop_frame_info: inspect.FrameInfo, filename: str): caller_globals: Dict[str, Any] = loop_frame_info.frame.f_globals caller_locals: Dict[str, Any] = loop_frame_info.frame.f_locals file_stat: int = os.stat(filename).st_mtime_ns while_loop = get_loop_code( - loop_frame_info, loop_id=None + loop_frame_info, loop_id=None, filename=filename ) def condition(while_loop): @@ -407,7 +400,7 @@ def condition(while_loop): log.info(f'While loop at line {loop_frame_info.lineno} of file ' f'"{filename}" has been reloaded.') while_loop = get_loop_code( - loop_frame_info, loop_id=while_loop.id + loop_frame_info, loop_id=while_loop.id, filename=filename ) file_stat = file_stat_ try: @@ -433,20 +426,27 @@ def _reloading_loop(seq: Union[Iterable, bool]) -> Iterable: assert stack[1].function == "reloading" # The third element is the loop which called reloading. loop_frame_info: inspect.FrameInfo = stack[2] + filename: str = loop_frame_info.filename + # If we are running in Jupyter Notebook then the filename + # of the current notebook is stored in the __session__ variable. + if ".ipynb" in loop_frame_info.frame.f_globals.get("__session__", ""): + filename = str(loop_frame_info.frame.f_globals.get("__session__")) # Replace filename with Jupyter Notebook file name # if we are in a Jupyter Notebook session. loop_object = get_loop_code( - loop_frame_info, loop_id=None + loop_frame_info, loop_id=None, filename=filename ) if isinstance(loop_object, ForLoop): assert isinstance(seq, Iterable) - execute_for_loop(seq, loop_frame_info) + execute_for_loop(seq, loop_frame_info, filename) elif isinstance(loop_object, WhileLoop): - execute_while_loop(loop_frame_info) + execute_while_loop(loop_frame_info, filename) # If there is a third element, then it is the scope which called the loop. - # It is only possible to modify variables in this scope since Python 3.13. + # If this is the main scope, then all is good. Howver, if we are in a + # scope within the main scope then it is only possible to modify + # variables in this scope since Python 3.13. if (len(stack) > 3 and sys.version_info.major >= 3 and sys.version_info.minor >= 13): @@ -457,19 +457,22 @@ def _reloading_loop(seq: Union[Iterable, bool]) -> Iterable: # print(i) loop_caller_frame: inspect.FrameInfo = stack[3] loop_caller_frame.frame.f_locals.update(loop_frame_info.frame.f_locals) - elif len(stack) > 3: + elif (len(stack) > 3 and + loop_frame_info.frame.f_locals.get("__name__", "") != "__main__"): variables = ", ".join( f'"{k}"' for k in loop_frame_info.frame.f_locals.keys()) log.warning(f"Variable(s) {variables} in reloaded loop were not " "exported to the scope which called the reloaded loop " f'initially defined at line {loop_frame_info.lineno} in ' - f'file "{loop_frame_info.filename}".') + f'file "{filename}".') return [] def get_decorator_name_or_none(decorator_node): if hasattr(decorator_node, "id"): return decorator_node.id + elif hasattr(decorator_node, "attr"): + return decorator_node.attr elif hasattr(decorator_node.func, "id"): return decorator_node.func.id elif hasattr(decorator_node.func.value, "id"): @@ -544,9 +547,10 @@ def sorting_function(candidate): def get_reloaded_function(caller_globals: Dict[str, Any], caller_locals: Dict[str, Any], function_frame_info: inspect.FrameInfo, - function: Callable) -> Callable: + function: Callable, + filename: str) -> Callable: reloaded_file_ast: ast.Module = parse_file_until_successful( - function_frame_info.filename) + filename) function_ast = isolate_function_def(function_frame_info, function, reloaded_file_ast) @@ -569,6 +573,10 @@ def _reloading_function(function: Callable) -> Callable: # The third element is the loop which called reloading. function_frame_info: inspect.FrameInfo = stack[2] filename: str = function_frame_info.filename + # If we are running in Jupyter Notebook then the filename + # of the current notebook is stored in the __session__ variable. + if ".ipynb" in function_frame_info.frame.f_globals.get("__session__", ""): + filename = str(function_frame_info.frame.f_globals.get("__session__")) caller_globals = function_frame_info.frame.f_globals caller_locals = function_frame_info.frame.f_locals @@ -577,7 +585,8 @@ def _reloading_function(function: Callable) -> Callable: rfunction = get_reloaded_function(caller_globals, caller_locals, function_frame_info, - function) + function, + filename) i: int = 0 def wrapped(*args, **kwargs): @@ -591,7 +600,8 @@ def wrapped(*args, **kwargs): rfunction = get_reloaded_function(caller_globals, caller_locals, function_frame_info, - function) + function, + filename) file_stat = file_stat_ i += 1 while True: diff --git a/reloading/test_reloading.py b/reloading/test_reloading.py index 009c67f..82bad46 100644 --- a/reloading/test_reloading.py +++ b/reloading/test_reloading.py @@ -57,6 +57,11 @@ def test_range_pass(self): for _ in reloading(range(10)): pass + def test_module_import(self): + import reloading + for _ in reloading.reloading(range(10)): + pass + def test_range_body(self): i = 0 for _ in reloading(range(10)): @@ -146,10 +151,11 @@ def condition(): def test_condition(self): i = 0 - while i < 10: + while reloading(i < 10): i += 1 - self.assertEqual(i, 10) + if sys.version_info.major >= 3 and sys.version_info.minor >= 13: + self.assertEqual(i, 10) def test_use_outside_loop(self): with self.assertRaises(Exception): @@ -158,14 +164,21 @@ def test_use_outside_loop(self): def test_continue(self): i = 0 j = 0 - while i < 10: + while reloading(i < 10): i += 1 if i > 5: continue j = i - self.assertEqual(i, 10) - self.assertEqual(j, 5) + if sys.version_info.major >= 3 and sys.version_info.minor >= 13: + self.assertEqual(i, 10) + self.assertEqual(j, 5) + + def test_module_import(self): + import reloading + i = 0 + while reloading.reloading(i < 10): + i += 1 class TestReloadingFunctionWithoutChanges(unittest.TestCase): @@ -181,6 +194,15 @@ def function(): function() + def test_module_import(self): + import reloading + + @reloading.reloading + def function(): + pass + + function() + def test_function_return_value(self): @reloading def function(): From 5b2b4e38125ab013060bfca63f70c10054488cff Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Sat, 21 Dec 2024 23:13:42 +0100 Subject: [PATCH 48/65] Type check with mypy. Lint with ruff. --- README.md | 2 ++ pyproject.toml | 2 ++ reloading/reloading.py | 2 +- reloading/test_reloading.py | 4 ++-- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3c78623..f52f55d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Reloading [![CI](https://github.com/nneskildsf/reloading/actions/workflows/CI.yml/badge.svg)](https://github.com/nneskildsf/reloading/actions/workflows/CI.yml) +[![Checked with mypy](https://www.mypy-lang.org/static/mypy_badge.svg)](https://mypy-lang.org/) +[![Linting: Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) A Python utility to reload a function or loop body from source on each iteration without losing state. diff --git a/pyproject.toml b/pyproject.toml index 1ed4521..ce55b9d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,6 +38,8 @@ development = [ "nbformat", "flake8", "pyright", + "mypy", + "ruff", "build", ] diff --git a/reloading/reloading.py b/reloading/reloading.py index 04e6f78..9dcf96f 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -66,7 +66,7 @@ def reloading(fn_or_seq_or_bool: Optional[ source before each invocation or iteration, respectively. """ if fn_or_seq_or_bool is not None: - if isinstance(fn_or_seq_or_bool, Callable): + if callable(fn_or_seq_or_bool): return _reloading_function(fn_or_seq_or_bool) elif (isinstance(fn_or_seq_or_bool, Iterable) or isinstance(fn_or_seq_or_bool, bool)): diff --git a/reloading/test_reloading.py b/reloading/test_reloading.py index 82bad46..0f5460c 100644 --- a/reloading/test_reloading.py +++ b/reloading/test_reloading.py @@ -28,8 +28,8 @@ def run_and_update_source(init_src, updated_src=None, update_after=0.5): f.flush() try: - stdout, _ = proc.communicate(timeout=2) - stdout = stdout.decode("utf-8") + stdout_bytes, _ = proc.communicate(timeout=2) + stdout = stdout_bytes.decode("utf-8") has_error = False except Exception: stdout = "" From e477a9efe5a1c0a8e45137d0508f02c3ef175c19 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Sun, 22 Dec 2024 11:17:23 +0100 Subject: [PATCH 49/65] Support wrapping functions. Add tests. --- README.md | 11 ++++++ reloading/reloading.py | 39 ++++++++++++++++-- reloading/test_reloading.py | 79 ++++++++++++++++++++++++++++++++----- 3 files changed, 116 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index f52f55d..8faf4e4 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,17 @@ def function(): pass ``` +It is also possible to mark a function for reload after defining it: +```python +from reloading import reloading + +def function(): + # This function will be reloaded before each function call + pass + +function = reloading(function) +``` + ## Additional Options To iterate forever in a `for` loop you can omit the argument: diff --git a/reloading/reloading.py b/reloading/reloading.py index 9dcf96f..8213949 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -491,9 +491,10 @@ def strip_reloading_decorator(function_with_decorator: ast.FunctionDef): decorator_names = [get_decorator_name_or_none(decorator) for decorator in fwod.decorator_list] - # Find index of "reloading" decorator - reloading_index = decorator_names.index("reloading") - fwod.decorator_list = fwod.decorator_list[reloading_index + 1:] + if "reloading" in decorator_names: + # Find index of "reloading" decorator + reloading_index = decorator_names.index("reloading") + fwod.decorator_list = fwod.decorator_list[reloading_index + 1:] function_without_decorator = fwod return function_without_decorator @@ -511,6 +512,7 @@ def isolate_function_def(function_frame_info: inspect.FrameInfo, class_name = qualname.split(".")[length - 2] if length > 1 else None candidates = [] + weak_candidates = [] for node in ast.walk(reloaded_file_ast): if isinstance(node, ast.ClassDef) and node.name == class_name: for subnode in node.body: @@ -527,6 +529,24 @@ def isolate_function_def(function_frame_info: inspect.FrameInfo, for decorator in node.decorator_list ]: candidates.append(node) + else: + # The function was not decorated... Hmm + # This could be because the function was wrapped. Example: + # def f(x): + # return x + # f = reloading(f) + # If we only find ONE function which matches by name, + # then we return it. If we're confused though, due to + # multiple definitions of function with the same + # name then we raise and exception. Example: + # def f(x): + # return x + # def g(x): + # def f(x): + # return x + # return f(x) + # f = reloading(f) + weak_candidates.append(node) # Select the candidate node which is closest to function_frame_info if len(candidates): def sorting_function(candidate): @@ -535,6 +555,19 @@ def sorting_function(candidate): function_node = strip_reloading_decorator(candidate) function_node_ast = ast.Module([function_node], type_ignores=[]) return function_node_ast + elif len(weak_candidates) == 1: + candidate = weak_candidates[0] + function_node = strip_reloading_decorator(candidate) + function_node_ast = ast.Module([function_node], type_ignores=[]) + return function_node_ast + elif len(weak_candidates) > 1: + raise ReloadingException( + f'The file "{function_frame_info.filename}" contains ' + f'{len(weak_candidates)} definitions of functions with the name ' + f'"{function_name}" so it is not possible to figure out which ' + 'one to reload. This can be resolved by decorating the function ' + 'instead of wrapping it.' + ) else: raise ReloadingException( f'Unable to reload function "{function_name}" ' diff --git a/reloading/test_reloading.py b/reloading/test_reloading.py index 0f5460c..4829824 100644 --- a/reloading/test_reloading.py +++ b/reloading/test_reloading.py @@ -187,6 +187,12 @@ def test_empty_function_definition(self): def function(): pass + def test_empty_function_wrapped(self): + def function(): + pass + + function = reloading(function) + def test_empty_function_run(self): @reloading def function(): @@ -210,6 +216,13 @@ def function(): self.assertEqual(function(), "result") + def test_function_return_value_wrapped(self): + def function(): + return "result" + + function = reloading(function) + self.assertEqual(function(), "result") + def test_nested_function(self): def outer(): @reloading @@ -397,7 +410,7 @@ def f(): print(f()+'g') sleep(0.2) """ - stdout, stderr = run_and_update_source( + stdout, _ = run_and_update_source( init_src=code, updated_src=code.replace("'f'", "'F'"). replace("'g'", "'G'"), @@ -441,7 +454,7 @@ def f(): sleep(0.2) i += 1 """ - stdout, stderr = run_and_update_source( + stdout, _ = run_and_update_source( init_src=code, updated_src=code.replace("'f'", "'F'"). replace("'g'", "'G'"), @@ -546,22 +559,25 @@ def g(): self.assertIn("fg", stdout) self.assertIn("FG", stdout) - -class TestReloadingMixedWithChanges(unittest.TestCase): - def test_function_for_loop(self): + def test_multiple_functions_not_decorated(self): code = """ from reloading import reloading from time import sleep -@reloading def f(): return 'f' -for i in reloading(range(10)): - print(f()+'g') +def g(): + return 'g' + +f = reloading(f) +g = reloading(g) + +for i in range(10): + print(f()+g()) sleep(0.2) """ - stdout, stderr = run_and_update_source( + stdout, _ = run_and_update_source( init_src=code, updated_src=code.replace("'f'", "'F'"). replace("'g'", "'G'"), @@ -570,6 +586,49 @@ def f(): self.assertIn("fg", stdout) self.assertIn("FG", stdout) + def test_class_decorates_methods(self): + code = """ +from reloading import reloading +from time import sleep + +def get_subclass_methods(cls): + methods = set(dir(cls(_get_subclass_methods=True))) + unique_methods = methods.difference( + *(dir(base()) for base in cls.__bases__) + ) + return list(unique_methods) + +class ClassWhichMarksSubclassMethodsForReload: + def __init__(self, *args, **kwargs): + if (self.__class__.__name__ != super().__thisclass__.__name__ + and not '_get_subclass_methods' in kwargs): + methods_of_subclass = get_subclass_methods(self.__class__) + for method in methods_of_subclass: + setattr(self.__class__, method, + reloading(getattr(self.__class__, method))) + def f(self): + return 'f' + +class Subclass(ClassWhichMarksSubclassMethodsForReload): + def g(self): + return 'g' + +obj = Subclass() + +for i in range(10): + print(obj.f()+obj.g()) + sleep(0.2) +""" + stdout, _ = run_and_update_source( + init_src=code, + updated_src=code.replace("'f'", "'F'"). + replace("'g'", "'G'"), + ) + + self.assertIn("fg", stdout) + self.assertIn("fG", stdout) + self.assertNotIn("FG", stdout) + def test_function_while_loop(self): code = """ from reloading import reloading @@ -585,7 +644,7 @@ def f(): sleep(0.2) i += 1 """ - stdout, stderr = run_and_update_source( + stdout, _ = run_and_update_source( init_src=code, updated_src=code.replace("'f'", "'F'"). replace("'g'", "'G'"), From 3a25a0e0e65487568934e6594ba80b0114539d6f Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Sun, 22 Dec 2024 23:05:34 +0100 Subject: [PATCH 50/65] Support multiple reloaded functions with identical names. --- reloading/reloading.py | 211 ++++++++++++++++++++---------------- reloading/test_reloading.py | 19 ++-- 2 files changed, 130 insertions(+), 100 deletions(-) diff --git a/reloading/reloading.py b/reloading/reloading.py index 8213949..1564d6c 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -224,6 +224,7 @@ def __init__(self, def get_loop_object(loop_frame_info: inspect.FrameInfo, reloaded_file_ast: ast.Module, + filename: str, loop_id: Union[None, str]) -> Union[WhileLoop, ForLoop]: """ Traverse AST for the entire reloaded file in a search for the @@ -252,7 +253,7 @@ def get_loop_object(loop_frame_info: inspect.FrameInfo, raise ReloadingException( f'Unable to reload loop initially defined at line ' f'{loop_frame_info.lineno} ' - f'in file "{loop_frame_info.filename}". ' + f'in file "{filename}". ' 'The loop might have been removed.' ) @@ -288,7 +289,7 @@ def get_loop_code(loop_frame_info: inspect.FrameInfo, reloaded_file_ast: ast.Module = parse_file_until_successful(filename) try: return get_loop_object( - loop_frame_info, reloaded_file_ast, loop_id=loop_id + loop_frame_info, reloaded_file_ast, filename, loop_id=loop_id ) except (LookupError, ReloadingException): handle_exception(filename) @@ -499,101 +500,132 @@ def strip_reloading_decorator(function_with_decorator: ast.FunctionDef): return function_without_decorator -def isolate_function_def(function_frame_info: inspect.FrameInfo, - function: Callable, - reloaded_file_ast: ast.Module) -> ast.Module: +# Source: https://stackoverflow.com/questions/34570992/ +class Parentage(ast.NodeTransformer): + # current parent (module) + parent = None + + def visit(self, node: Any): + # set parent attribute for this node + node.parent = self.parent + # This node becomes the new parent + self.parent = node + # Do any work required by super class + node = super().visit(node) + # If we have a valid node (ie. node not being removed) + if isinstance(node, ast.AST): + # update the parent, since this may have been transformed + # to a different node by super + self.parent = getattr(node, "parent") + return node + + +def get_node_id(node) -> str: + path = "" + while node.parent: + path = node.__class__.__name__+("." if path else "")+path + node = node.parent + return path + + +class Function: + def __init__(self, + function_name: str, + function_frame_info: inspect.FrameInfo, + ast_module: ast.Module, + id: str): + self.ast_module = ast_module + self.id = id + self.name = function_name + caller_locals = function_frame_info.frame.f_locals + caller_globals = function_frame_info.frame.f_globals + # Copy locals to avoid exec overwriting the decorated function with + # the new undecorated function. + caller_locals_copy = caller_locals.copy() + compiled_body = compile(ast_module, filename="", mode="exec") + exec(compiled_body, caller_globals, caller_locals_copy) + self.function = caller_locals_copy[function_name] + + +def get_function_object(function_frame_info: inspect.FrameInfo, + function: Callable, + reloaded_file_ast: ast.Module, + filename: str, + function_id: Union[None, str] = None) -> Function: """ - Traverse AST for the entire reloaded file in a search for the + Traverse AST foar the entire reloaded file in a search for the function (minus the reloading decorator) which is reloaded. """ qualname = function.__qualname__ - length = len(qualname.split(".")) function_name = qualname.split(".")[-1] - class_name = qualname.split(".")[length - 2] if length > 1 else None - candidates = [] - weak_candidates = [] + candidate = None + Parentage().visit(reloaded_file_ast) + relevant_nodes = [] for node in ast.walk(reloaded_file_ast): - if isinstance(node, ast.ClassDef) and node.name == class_name: - for subnode in node.body: - if (isinstance(subnode, ast.FunctionDef) and - subnode.name == function_name): - if "reloading" in [ - get_decorator_name_or_none(decorator) - for decorator in subnode.decorator_list - ]: - candidates.append(subnode) - if isinstance(node, ast.FunctionDef) and node.name == function_name: - if "reloading" in [ - get_decorator_name_or_none(decorator) - for decorator in node.decorator_list - ]: - candidates.append(node) - else: - # The function was not decorated... Hmm - # This could be because the function was wrapped. Example: - # def f(x): - # return x - # f = reloading(f) - # If we only find ONE function which matches by name, - # then we return it. If we're confused though, due to - # multiple definitions of function with the same - # name then we raise and exception. Example: - # def f(x): - # return x - # def g(x): - # def f(x): - # return x - # return f(x) - # f = reloading(f) - weak_candidates.append(node) + if (isinstance(node, ast.FunctionDef) and + node.name == function.__name__): + relevant_nodes.append(node) + if function_id is None: + # If we don't have an ID, then it is because this is the + # first time we get the function object. In this case, we + # can assume that the function object and the AST are in sync. + # That is, if the line numbers match then it's all good. + if node.lineno == function.__code__.co_firstlineno: + candidate = node + break + # Okay, so the line numbers don't match exactly. This could be + # because of decorators. Check if the function is decorated + # for reloading and that the line numbers are plausible. + node_l = node.lineno + function_l = function.__code__.co_firstlineno + if all(["reloading" in [get_decorator_name_or_none(decorator) + for decorator in node.decorator_list], + node_l > function_l, + node_l - function_l <= len(node.decorator_list)]): + candidate = node + break + # If the node IDs match then its a sure thing. + if get_node_id(node) == function_id: + candidate = node + break + if candidate is None and len(relevant_nodes) == 1: + candidate = relevant_nodes[0] + elif candidate is None and len(relevant_nodes) > 1: + raise ReloadingException( + f'File "{filename}" contains ' + f'{len(relevant_nodes)} definitions of function ' + f'"{function_name}" and it is not possible ' + f'to determine which to reload.') # Select the candidate node which is closest to function_frame_info - if len(candidates): - def sorting_function(candidate): - return abs(candidate.lineno - function_frame_info.lineno) - candidate = min(candidates, key=sorting_function) + if candidate: + function_id = get_node_id(candidate) function_node = strip_reloading_decorator(candidate) function_node_ast = ast.Module([function_node], type_ignores=[]) - return function_node_ast - elif len(weak_candidates) == 1: - candidate = weak_candidates[0] - function_node = strip_reloading_decorator(candidate) - function_node_ast = ast.Module([function_node], type_ignores=[]) - return function_node_ast - elif len(weak_candidates) > 1: - raise ReloadingException( - f'The file "{function_frame_info.filename}" contains ' - f'{len(weak_candidates)} definitions of functions with the name ' - f'"{function_name}" so it is not possible to figure out which ' - 'one to reload. This can be resolved by decorating the function ' - 'instead of wrapping it.' - ) + return Function(function.__name__, + function_frame_info, + function_node_ast, + function_id) else: raise ReloadingException( f'Unable to reload function "{function_name}" ' - f'in file "{function_frame_info.filename}". ' + f'in file "{filename}". ' 'The function might have been renamed or the ' 'decorator might have been removed.' ) -def get_reloaded_function(caller_globals: Dict[str, Any], - caller_locals: Dict[str, Any], - function_frame_info: inspect.FrameInfo, +def get_reloaded_function(function_frame_info: inspect.FrameInfo, function: Callable, - filename: str) -> Callable: + filename: str, + function_id: Union[None, str]) -> Function: reloaded_file_ast: ast.Module = parse_file_until_successful( filename) - function_ast = isolate_function_def(function_frame_info, - function, - reloaded_file_ast) - # Copy locals to avoid exec overwriting the decorated function with the new - # undecorated function. - caller_locals_copy = caller_locals.copy() - compiled_body = compile(function_ast, filename="", mode="exec") - exec(compiled_body, caller_globals, caller_locals_copy) - function = caller_locals_copy[function.__name__] - return function + return get_function_object(function_frame_info, + function, + reloaded_file_ast, + filename, + function_id) def _reloading_function(function: Callable) -> Callable: @@ -611,35 +643,32 @@ def _reloading_function(function: Callable) -> Callable: if ".ipynb" in function_frame_info.frame.f_globals.get("__session__", ""): filename = str(function_frame_info.frame.f_globals.get("__session__")) - caller_globals = function_frame_info.frame.f_globals caller_locals = function_frame_info.frame.f_locals file_stat: int = os.stat(filename).st_mtime_ns - rfunction = get_reloaded_function(caller_globals, - caller_locals, - function_frame_info, - function, - filename) + function_object = get_reloaded_function(function_frame_info, + function, + filename, + function_id=None) i: int = 0 def wrapped(*args, **kwargs): - nonlocal file_stat, function, rfunction, i + nonlocal file_stat, function, function_object, i # Reload code if possibly modified file_stat_: int = os.stat(filename).st_mtime_ns if file_stat != file_stat_: - log.info(f'Function "{function.__name__}" at line ' - f'{function_frame_info.lineno} ' + log.info(f'Function "{function.__name__}" initially defined at ' + f'line {function_frame_info.lineno} ' f'of file "{filename}" has been reloaded.') - rfunction = get_reloaded_function(caller_globals, - caller_locals, - function_frame_info, - function, - filename) + function_object = get_reloaded_function(function_frame_info, + function, + filename, + function_object.id) file_stat = file_stat_ i += 1 while True: try: - result = rfunction(*args, **kwargs) + result = function_object.function(*args, **kwargs) return result except Exception: handle_exception(filename) diff --git a/reloading/test_reloading.py b/reloading/test_reloading.py index 4829824..b172146 100644 --- a/reloading/test_reloading.py +++ b/reloading/test_reloading.py @@ -212,33 +212,34 @@ def function(): def test_function_return_value(self): @reloading def function(): - return "result" + return "1" - self.assertEqual(function(), "result") + self.assertEqual(function(), "1") def test_function_return_value_wrapped(self): def function(): - return "result" + return "2" function = reloading(function) - self.assertEqual(function(), "result") + self.assertEqual(function(), "2") def test_nested_function(self): def outer(): @reloading def inner(): - return "result" + return "3" return inner() - self.assertEqual(outer(), "result") + self.assertEqual(outer(), "3") def test_function_signature_is_preserved(self): @reloading def some_func(a, b, c): - return "result" + return "4" import inspect self.assertEqual(str(inspect.signature(some_func)), "(a, b, c)") + self.assertEqual(some_func(1, 2, 3), "4") def test_decorated_function(self): def decorator(f): @@ -249,9 +250,9 @@ def wrap(): @decorator @reloading def f(): - return 2 + return 6 - self.assertEqual(f(), "<2>") + self.assertEqual(f(), "<6>") class TestReloadingForLoopWithChanges(unittest.TestCase): From 56bfb944b8be489a16253a8c36536aea6a5187f2 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Mon, 23 Dec 2024 09:45:54 +0100 Subject: [PATCH 51/65] Fix reload of imported function. Add test cases with import. --- reloading/reloading.py | 4 +-- reloading/test_reloading.py | 65 ++++++++++++++++++++++++++++++++++++- 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/reloading/reloading.py b/reloading/reloading.py index 1564d6c..4b532c8 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -635,9 +635,9 @@ def _reloading_function(function: Callable) -> Callable: assert stack[0].function == "_reloading_function" # The second element is the caller of the first, i.e. reloading assert stack[1].function == "reloading" - # The third element is the loop which called reloading. + # The third element is the function which called reloading function_frame_info: inspect.FrameInfo = stack[2] - filename: str = function_frame_info.filename + filename: str = function.__code__.co_filename # If we are running in Jupyter Notebook then the filename # of the current notebook is stored in the __session__ variable. if ".ipynb" in function_frame_info.frame.f_globals.get("__session__", ""): diff --git a/reloading/test_reloading.py b/reloading/test_reloading.py index b172146..175b948 100644 --- a/reloading/test_reloading.py +++ b/reloading/test_reloading.py @@ -3,12 +3,12 @@ import os import subprocess import time +import importlib from reloading import reloading SRC_FILE_NAME = "temporary_testing_file.py" - def run_and_update_source(init_src, updated_src=None, update_after=0.5): """Runs init_src in a subprocess and updates source to updated_src after update_after seconds. Returns the standard output of the subprocess and @@ -104,6 +104,23 @@ def test_continue(self): self.assertEqual(i, 10) self.assertEqual(j, 5) + def test_iterator_in_library(self): + with open("temporary_library.py", "w") as f: + f.write(""" +def iterator(): + return range(10) +""") + import temporary_library + importlib.reload(temporary_library) + + i = 0 + for i in reloading(temporary_library.iterator()): + pass + + if sys.version_info.major >= 3 and sys.version_info.minor >= 13: + self.assertEqual(i, 9) + if os.path.isfile("temporary_library.py"): + os.remove("temporary_library.py") class TestReloadingWhileLoopWithoutChanges(unittest.TestCase): def test_no_argument(self): @@ -180,6 +197,23 @@ def test_module_import(self): while reloading.reloading(i < 10): i += 1 + def test_condition_in_library(self): + with open("temporary_library.py", "w") as f: + f.write(""" +def condition(x): + return x < 10 +""") + import temporary_library + importlib.reload(temporary_library) + + i = 0 + while reloading(temporary_library.condition(i)): + i += 1 + + if sys.version_info.major >= 3 and sys.version_info.minor >= 13: + self.assertEqual(i, 10) + if os.path.isfile("temporary_library.py"): + os.remove("temporary_library.py") class TestReloadingFunctionWithoutChanges(unittest.TestCase): def test_empty_function_definition(self): @@ -254,6 +288,35 @@ def f(): self.assertEqual(f(), "<6>") + def test_function_in_library(self): + with open("temporary_library.py", "w") as f: + f.write(""" +def function_not_marked(x): + return x +""") + import temporary_library + importlib.reload(temporary_library) + self.assertEqual(temporary_library.function_not_marked("7"), "7") + g = reloading(temporary_library.function_not_marked) + self.assertEqual(g("8"), "8") + if os.path.isfile("temporary_library.py"): + os.remove("temporary_library.py") + + def test_reloading_function_in_library(self): + with open("temporary_library.py", "w") as f: + f.write(""" +from reloading import reloading + +@reloading +def function_marked(x): + return x +""") + import temporary_library + importlib.reload(temporary_library) + self.assertEqual(temporary_library.function_marked("9"), "9") + if os.path.isfile("temporary_library.py"): + os.remove("temporary_library.py") + class TestReloadingForLoopWithChanges(unittest.TestCase): def test_changing_source_loop(self): From a99589152b0c03e88699d0c27662575410e340fc Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Mon, 23 Dec 2024 10:02:23 +0100 Subject: [PATCH 52/65] Flake8 fixes --- reloading/test_reloading.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/reloading/test_reloading.py b/reloading/test_reloading.py index 175b948..c28acbc 100644 --- a/reloading/test_reloading.py +++ b/reloading/test_reloading.py @@ -9,6 +9,7 @@ SRC_FILE_NAME = "temporary_testing_file.py" + def run_and_update_source(init_src, updated_src=None, update_after=0.5): """Runs init_src in a subprocess and updates source to updated_src after update_after seconds. Returns the standard output of the subprocess and @@ -122,6 +123,7 @@ def iterator(): if os.path.isfile("temporary_library.py"): os.remove("temporary_library.py") + class TestReloadingWhileLoopWithoutChanges(unittest.TestCase): def test_no_argument(self): i = 0 @@ -215,6 +217,7 @@ def condition(x): if os.path.isfile("temporary_library.py"): os.remove("temporary_library.py") + class TestReloadingFunctionWithoutChanges(unittest.TestCase): def test_empty_function_definition(self): @reloading From f3a49cf6e594496b48b7d18c7f49629bc5dd18ae Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Mon, 23 Dec 2024 10:06:15 +0100 Subject: [PATCH 53/65] Silence reportMissingImport for temporary library --- reloading/test_reloading.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reloading/test_reloading.py b/reloading/test_reloading.py index c28acbc..87fe327 100644 --- a/reloading/test_reloading.py +++ b/reloading/test_reloading.py @@ -111,7 +111,7 @@ def test_iterator_in_library(self): def iterator(): return range(10) """) - import temporary_library + import temporary_library # type: ignore importlib.reload(temporary_library) i = 0 @@ -205,7 +205,7 @@ def test_condition_in_library(self): def condition(x): return x < 10 """) - import temporary_library + import temporary_library # type: ignore importlib.reload(temporary_library) i = 0 @@ -297,7 +297,7 @@ def test_function_in_library(self): def function_not_marked(x): return x """) - import temporary_library + import temporary_library # type: ignore importlib.reload(temporary_library) self.assertEqual(temporary_library.function_not_marked("7"), "7") g = reloading(temporary_library.function_not_marked) @@ -314,7 +314,7 @@ def test_reloading_function_in_library(self): def function_marked(x): return x """) - import temporary_library + import temporary_library # type: ignore importlib.reload(temporary_library) self.assertEqual(temporary_library.function_marked("9"), "9") if os.path.isfile("temporary_library.py"): From b5ab557007c6766aafefbdf042be02b26c265d63 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Mon, 23 Dec 2024 10:09:19 +0100 Subject: [PATCH 54/65] Flake8... --- reloading/test_reloading.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reloading/test_reloading.py b/reloading/test_reloading.py index 87fe327..000bd72 100644 --- a/reloading/test_reloading.py +++ b/reloading/test_reloading.py @@ -111,7 +111,7 @@ def test_iterator_in_library(self): def iterator(): return range(10) """) - import temporary_library # type: ignore + import temporary_library # type: ignore importlib.reload(temporary_library) i = 0 @@ -205,7 +205,7 @@ def test_condition_in_library(self): def condition(x): return x < 10 """) - import temporary_library # type: ignore + import temporary_library # type: ignore importlib.reload(temporary_library) i = 0 @@ -297,7 +297,7 @@ def test_function_in_library(self): def function_not_marked(x): return x """) - import temporary_library # type: ignore + import temporary_library # type: ignore importlib.reload(temporary_library) self.assertEqual(temporary_library.function_not_marked("7"), "7") g = reloading(temporary_library.function_not_marked) @@ -314,7 +314,7 @@ def test_reloading_function_in_library(self): def function_marked(x): return x """) - import temporary_library # type: ignore + import temporary_library # type: ignore importlib.reload(temporary_library) self.assertEqual(temporary_library.function_marked("9"), "9") if os.path.isfile("temporary_library.py"): From de0cb19ea1af75f5da4b288f28f0438d56cb08c6 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Mon, 23 Dec 2024 20:31:36 +0100 Subject: [PATCH 55/65] Add Windows to CI --- .github/workflows/CI.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 394cd08..9786a25 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -8,10 +8,11 @@ on: jobs: test_2004: - name: Ubuntu 20.04 - Python ${{ matrix.python-version }} - runs-on: ubuntu-20.04 + name: ${{ matrix.os }} - Python ${{ matrix.python-version }} + runs-on: ${{ matrix.os }} strategy: matrix: + os: [ubuntu-20.04, windows-latest] python-version: ["3.6", "3.7"] steps: - uses: actions/checkout@v4 @@ -26,10 +27,11 @@ jobs: - name: Test with unittest run: python -m unittest test_2204: - name: Ubuntu 22.04 - Python ${{ matrix.python-version }} - runs-on: ubuntu-22.04 + name: ${{ matrix.os }} - Python ${{ matrix.python-version }} + runs-on: ${{ matrix.os }} strategy: matrix: + os: [ubuntu-22.04, windows-latest] python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] steps: - uses: actions/checkout@v4 From a7ef07504e7e218c32fa4cde94eea76c4154f759 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Mon, 23 Dec 2024 20:39:33 +0100 Subject: [PATCH 56/65] Force utf-8 encoding to please Windows. --- reloading/test_reloading.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reloading/test_reloading.py b/reloading/test_reloading.py index 000bd72..10cf35e 100644 --- a/reloading/test_reloading.py +++ b/reloading/test_reloading.py @@ -15,7 +15,7 @@ def run_and_update_source(init_src, updated_src=None, update_after=0.5): update_after seconds. Returns the standard output of the subprocess and whether the subprocess produced an uncaught exception. """ - with open(SRC_FILE_NAME, "w") as f: + with open(SRC_FILE_NAME, "w", encoding="utf-8") as f: f.write(init_src) cmd = ["python", SRC_FILE_NAME] @@ -24,7 +24,7 @@ def run_and_update_source(init_src, updated_src=None, update_after=0.5): stderr=subprocess.PIPE) as proc: if updated_src is not None: time.sleep(update_after) - with open(SRC_FILE_NAME, "w") as f: + with open(SRC_FILE_NAME, "w", encoding="utf-8") as f: f.write(updated_src) f.flush() From a50570c6d5abcc9587c19f7e2a7c62d0e4c5fdbd Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Mon, 23 Dec 2024 20:45:37 +0100 Subject: [PATCH 57/65] Add mypy and ruff. --- .github/workflows/CI.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 9786a25..dc6bdda 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -43,7 +43,11 @@ jobs: run: python -m pip install ".[development]" - name: Lint with flake8 run: flake8 + - name: Lint with ruff + run: ruff check . - name: Type check with pyright run: pyright + - name: Type check with mypy + run: mypy . - name: Test with unittest run: python -m unittest From d09e75e5c1b6421c9ba6fb53bc9459ae3c8b3ecd Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Mon, 23 Dec 2024 21:59:27 +0100 Subject: [PATCH 58/65] Log code changes. --- README.md | 33 ++++++++++++++++++++++++++++++++- pyproject.toml | 1 - reloading/reloading.py | 29 ++++++++++++++++++++++++++++- 3 files changed, 60 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8faf4e4..2903baf 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,7 @@ function = reloading(function) ## Additional Options +### Iterate Forever in For Loop To iterate forever in a `for` loop you can omit the argument: ```python from reloading import reloading @@ -81,6 +82,31 @@ for _ in reloading(): pass ``` +### Code Changes Logged +On Python 3.9 and newer, a diff is logged when the source code is updated. +Consider the following code as an example. +```python +from reloading import reloading +from time import sleep +import logging + +log = logging.getLogger("reloading") +log.setLevel(logging.DEBUG) + +for i in reloading(range(100)): + print(i) + sleep(1.0) +``` +After some time the code is edited. `i = 2*i` is added before `print(i)`, +resulting in the following log output: +```console +INFO:reloading:For loop at line 10 of file "../example.py" has been reloaded. +DEBUG:reloading:Code changes: ++i = i * 2 + print(i) + sleep(1.0) +``` + ## Known Issus On Python version [less than 3.13](https://docs.python.org/3/reference/datamodel.html#frame.f_locals) it is not possible to properly export the local variables from a loop to parent locals. The following example demonstrates this: @@ -95,14 +121,19 @@ def function(): function() # Prints 0. Not 10 as expected. Fixed in Python 3.13. ``` -A warning is emitted when the issue arises: `WARNING:reloading:Variable(s) "i" in reloaded loop were not exported to the scope which called the reloaded loop at line...`. +A warning is emitted when the issue arises: +```console +WARNING:reloading:Variable(s) "i" in reloaded loop were not exported to the scope which called the reloaded loop at line... +``` ## Lint, Type Check and Testing Run: ```console $ pip install -e ".[development]" +$ ruff check . $ flake8 $ pyright +$ mypy . $ python -m unittest ``` diff --git a/pyproject.toml b/pyproject.toml index ce55b9d..8cc7f45 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,5 +47,4 @@ development = [ include = ["reloading"] exclude = [ "**/__pycache__", - "examples", ] diff --git a/reloading/reloading.py b/reloading/reloading.py index 4b532c8..bdf5cc9 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -13,11 +13,29 @@ overload) from itertools import chain import logging +import difflib log = logging.getLogger("reloading") logging.basicConfig(level=logging.INFO) +def get_diff_text(ast_before: ast.Module, ast_after: ast.Module): + """ + Calculate difference between two versions of reloaded code. + """ + # Unparse was introduced in Python 3.9. + if sys.version_info.major >= 3 and sys.version_info.minor >= 9: + code_before = ast.unparse(ast_before) + code_after = ast.unparse(ast_after) + diff = difflib.unified_diff(code_before.splitlines(), + code_after.splitlines(), + lineterm="") + # Omit first three lines because they contain superfluous information. + return "\n".join(["Code changes:"]+list(diff)[3:]) + else: + return "Cannot compute code changes. Requires Python > 3.9." + + class ReloadingException(Exception): pass @@ -344,10 +362,13 @@ def execute_for_loop(seq: Iterable, if i > 0: log.info(f'For loop at line {loop_frame_info.lineno} of file ' f'"{filename}" has been reloaded.') + ast_before = for_loop.ast for_loop = get_loop_code( loop_frame_info, loop_id=for_loop.id, filename=filename ) assert isinstance(for_loop, ForLoop) + ast_after = for_loop.ast + log.debug(get_diff_text(ast_before, ast_after)) file_stat = file_stat_ # Make up a name for a variable which is not already present in # the global or local namespace. @@ -400,9 +421,12 @@ def condition(while_loop): if file_stat != file_stat_: log.info(f'While loop at line {loop_frame_info.lineno} of file ' f'"{filename}" has been reloaded.') + ast_before = while_loop.ast while_loop = get_loop_code( loop_frame_info, loop_id=while_loop.id, filename=filename ) + ast_after = while_loop.ast + log.debug(get_diff_text(ast_before, ast_after)) file_stat = file_stat_ try: exec(while_loop.compiled_body, caller_globals, caller_locals) @@ -534,7 +558,7 @@ def __init__(self, function_frame_info: inspect.FrameInfo, ast_module: ast.Module, id: str): - self.ast_module = ast_module + self.ast = ast_module self.id = id self.name = function_name caller_locals = function_frame_info.frame.f_locals @@ -660,10 +684,13 @@ def wrapped(*args, **kwargs): log.info(f'Function "{function.__name__}" initially defined at ' f'line {function_frame_info.lineno} ' f'of file "{filename}" has been reloaded.') + ast_before = function_object.ast function_object = get_reloaded_function(function_frame_info, function, filename, function_object.id) + ast_after = function_object.ast + log.debug(get_diff_text(ast_before, ast_after)) file_stat = file_stat_ i += 1 while True: From fff005abcb55c2b250fdebabd104ef7f7b93f6a9 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Mon, 23 Dec 2024 22:18:16 +0100 Subject: [PATCH 59/65] Satisfy mypy --- reloading/reloading.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reloading/reloading.py b/reloading/reloading.py index bdf5cc9..2708ac2 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -24,7 +24,9 @@ def get_diff_text(ast_before: ast.Module, ast_after: ast.Module): Calculate difference between two versions of reloaded code. """ # Unparse was introduced in Python 3.9. - if sys.version_info.major >= 3 and sys.version_info.minor >= 9: + if all([sys.version_info.major >= 3, + sys.version_info.minor >= 9, + hasattr(ast, "unparse")]): code_before = ast.unparse(ast_before) code_after = ast.unparse(ast_after) diff = difflib.unified_diff(code_before.splitlines(), From c9e3e8e67d6d66fd9e04026131236e52087a67ab Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Mon, 23 Dec 2024 22:33:47 +0100 Subject: [PATCH 60/65] Fix mypy error. --- reloading/reloading.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/reloading/reloading.py b/reloading/reloading.py index 2708ac2..c37ef56 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -24,16 +24,21 @@ def get_diff_text(ast_before: ast.Module, ast_after: ast.Module): Calculate difference between two versions of reloaded code. """ # Unparse was introduced in Python 3.9. - if all([sys.version_info.major >= 3, - sys.version_info.minor >= 9, - hasattr(ast, "unparse")]): - code_before = ast.unparse(ast_before) - code_after = ast.unparse(ast_after) + if sys.version_info.major >= 3 and sys.version_info.minor >= 9: + # mypy complains that unparse is not available in some + # versions of Python. + unparse = getattr(ast, "unparse") + code_before = unparse(ast_before) + code_after = unparse(ast_after) diff = difflib.unified_diff(code_before.splitlines(), code_after.splitlines(), lineterm="") # Omit first three lines because they contain superfluous information. - return "\n".join(["Code changes:"]+list(diff)[3:]) + changes = list(diff)[3:] + if len(changes): + return "\n".join(["Code changes:"]+changes) + else: + return "No code changes." else: return "Cannot compute code changes. Requires Python > 3.9." From 830fa9ce8f84cf39f35e4207a445f33d983cc175 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Tue, 24 Dec 2024 10:04:16 +0100 Subject: [PATCH 61/65] Support deep call stacks. Get variables from outer scope into function scope. Add tests. --- reloading/reloading.py | 16 +++++++++++++--- reloading/test_reloading.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/reloading/reloading.py b/reloading/reloading.py index c37ef56..5ccc39a 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -573,8 +573,12 @@ def __init__(self, # Copy locals to avoid exec overwriting the decorated function with # the new undecorated function. caller_locals_copy = caller_locals.copy() + caller_globals_copy = caller_globals.copy() + # Variables that are local to the calling scope + # are global to the function. + caller_globals_copy.update(caller_locals_copy) compiled_body = compile(ast_module, filename="", mode="exec") - exec(compiled_body, caller_globals, caller_locals_copy) + exec(compiled_body, caller_globals_copy, caller_locals_copy) self.function = caller_locals_copy[function_name] @@ -666,8 +670,15 @@ def _reloading_function(function: Callable) -> Callable: assert stack[0].function == "_reloading_function" # The second element is the caller of the first, i.e. reloading assert stack[1].function == "reloading" - # The third element is the function which called reloading + # The third element or later is the function which called reloading function_frame_info: inspect.FrameInfo = stack[2] + for frame_info in stack[2:]: + names_global = set(frame_info.frame.f_globals.keys()) + names_local = set(frame_info.frame.f_locals.keys()) + variables = names_local | names_global + if all([function.__name__ in variables, + frame_info.filename == function.__code__.co_filename]): + function_frame_info = frame_info filename: str = function.__code__.co_filename # If we are running in Jupyter Notebook then the filename # of the current notebook is stored in the __session__ variable. @@ -675,7 +686,6 @@ def _reloading_function(function: Callable) -> Callable: filename = str(function_frame_info.frame.f_globals.get("__session__")) caller_locals = function_frame_info.frame.f_locals - file_stat: int = os.stat(filename).st_mtime_ns function_object = get_reloaded_function(function_frame_info, function, diff --git a/reloading/test_reloading.py b/reloading/test_reloading.py index 10cf35e..0518e46 100644 --- a/reloading/test_reloading.py +++ b/reloading/test_reloading.py @@ -320,6 +320,39 @@ def function_marked(x): if os.path.isfile("temporary_library.py"): os.remove("temporary_library.py") + def test_deep_call_stack_make_locals_globals(self): + a = 2 + + def f(x): + b = 2 + return x*a*b + + def g(): + return reloading(f) + + function = g() + result = function("9") + + self.assertEqual(result, "9999") + + def test_deep_call_stack_prioritise_locals(self): + a = 2 + # Now flake8 does not complain about unused a + print(a) + + def f(x): + a = 3 + b = 2 + return x*a*b + + def g(): + return reloading(f) + + function = g() + result = function("9") + + self.assertEqual(result, "999999") + class TestReloadingForLoopWithChanges(unittest.TestCase): def test_changing_source_loop(self): From 6f7751beb5ecbd2374f44eef5f68e27ec4437250 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Thu, 26 Dec 2024 20:30:19 +0100 Subject: [PATCH 62/65] Add option to disable interactive exception handling. Add associated test cases. Tidy imports. --- README.md | 24 ++- reloading/reloading.py | 325 +++++++++++++++++++++++------------- reloading/test_reloading.py | 117 ++++++++++++- 3 files changed, 346 insertions(+), 120 deletions(-) diff --git a/README.md b/README.md index 2903baf..76cc0a9 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ This fork of reloading supports Python 3.6+. - Multiple reloading functions and loops in one file - Reloaded functions preserve their original call signature - Only reload source code when changed for faster performance -- Comprehensive exceptions and logging to let you know of errors +- Comprehensive exceptions and logging - Exports locals of reloaded loops to parent locals (Python 3.13 and newer) ## Usage @@ -72,6 +72,28 @@ function = reloading(function) ## Additional Options +### Interactive Exception Handling +Exceptions are handled interactively by default to avoid losing state. +When an exception occurs you will be notified and have the opportunity +to rectify the issue and continue. However, if reloading is +used in a setting where exceptions are better handled in the application +using reloading then it can be disabled by setting `interactive_exception` +to `False`. Example: +```python +from reloading import reloading + +@reloading(interactive_exception=False) +def reloading_function(): + pass + +for i in reloading(range(10), interactive_exception=False): + pass + +j = 0 +while reloading(j<10, interactive_exception=False): + j += 1 +``` + ### Iterate Forever in For Loop To iterate forever in a `for` loop you can omit the argument: ```python diff --git a/reloading/reloading.py b/reloading/reloading.py index 5ccc39a..452dbdd 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -1,21 +1,23 @@ +import ast +import difflib +import functools import inspect -import sys +import itertools +import logging import os -import ast +import sys import traceback -from typing import (Optional, - Union, +import types +from typing import (Any, Callable, - Iterable, Dict, - Any, + Iterable, List, - overload) -from itertools import chain -import logging -import difflib + Optional, + overload, + Union) -log = logging.getLogger("reloading") +log = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) @@ -60,7 +62,11 @@ def reloading(fn_or_seq_or_bool: bool) -> Iterable: ... @overload -def reloading() -> Iterable: ... +def reloading(*, interactive_exception: bool) -> Callable: ... + + +@overload +def reloading() -> Callable: ... @overload @@ -70,8 +76,9 @@ def reloading(fn_or_seq_or_bool: Callable) -> Callable: ... def reloading(fn_or_seq_or_bool: Optional[ Union[Iterable, Callable, - bool]] = None) -> Union[Iterable, - Callable]: + bool]] = None, + interactive_exception: bool = True) -> Union[Iterable, + Callable]: """ Wraps a loop iterator or decorates a function to reload the source code before every loop iteration or function invocation. @@ -86,36 +93,65 @@ def reloading(fn_or_seq_or_bool: Optional[ source before each execution. Args: - fn_or_seq_or_bool (function | iterable | bool): + fn_or_seq_or_bool: A function, iterator or condition which should be reloaded from source before each invocation or iteration, respectively. + interactive_exception: + Exceptions raised from reloading code are caught and you can fix + the code without losing state. """ + + def wrap(x): + if callable(x): + return _reloading_function(x, interactive_exception) + else: + raise TypeError(f'reloading expected function, got' + f', "{type(fn_or_seq_or_bool)}"') + if fn_or_seq_or_bool is not None: if callable(fn_or_seq_or_bool): - return _reloading_function(fn_or_seq_or_bool) + return _reloading_function(fn_or_seq_or_bool, + interactive_exception) elif (isinstance(fn_or_seq_or_bool, Iterable) or isinstance(fn_or_seq_or_bool, bool)): - return _reloading_loop(fn_or_seq_or_bool) + return _reloading_loop(fn_or_seq_or_bool, + interactive_exception) else: raise TypeError( - f'{reloading.__name__} expected function or iterable' + f'reloading expected function. iterable or bool' f', got "{type(fn_or_seq_or_bool)}"' ) else: - return _reloading_loop(iter(int, 1)) + # If reloading was called as a decorator with an argument, + # then we expect fn_or_seq_or_bool to be None, which is OK. + # However, if reloading was not called as a decorator and it + # did not get an argument then we assume that the user desired + # infinite iteration for a loop. + # Source: https://stackoverflow.com/questions/52191968/ + current_frame = inspect.currentframe() + assert isinstance(current_frame, types.FrameType) + assert isinstance(current_frame.f_back, types.FrameType) + frame = inspect.getframeinfo(current_frame.f_back, context=1) + assert frame.code_context is not None + # Remove whitespace due to indentation before .startswith + if frame.code_context[0].strip().startswith("@"): + return wrap + else: + return _reloading_loop(itertools.count(), interactive_exception) -def unique_name(seq: chain) -> str: +def unique_name(seq: itertools.chain) -> str: """ Function to generate string which is unique - relative to the supplied sequence + relative to the supplied sequence. """ return max(seq, key=len) + "0" def format_iteration_variables(ast_node: Union[ast.Name, ast.Tuple, - ast.List, None]) -> str: + ast.List, + None]) -> str: """ Formats an `ast_node` of loop iteration variables as string. """ @@ -162,7 +198,7 @@ def load_file(filename: str) -> str: # Join all blocks (a block is a multiline string of code) jupyter_code = "\n".join(blocks) # Jupyter has a magic meaning of !. Lines which start - # with "!" are not Python code. + # with "!" are not Python code. Comment them out. lines = [line.replace("!", "# !", 1) if line.startswith("!") else line for line in jupyter_code.split("\n")] src = "\n".join(lines) @@ -172,7 +208,8 @@ def load_file(filename: str) -> str: return src + "\n" -def parse_file_until_successful(filename: str) -> ast.Module: +def parse_file_until_successful(filename: str, + interactive_exception: bool) -> ast.Module: """ Parse source code of file containing reloading code. File may appear incomplete as as it is read so retry until successful. @@ -183,7 +220,7 @@ def parse_file_until_successful(filename: str) -> ast.Module: tree = ast.parse(source) return tree except SyntaxError: - handle_exception(filename) + handle_exception(filename, interactive_exception) source = load_file(filename) @@ -191,7 +228,7 @@ def parse_file_until_successful(filename: str) -> ast.Module: continue_ast = ast.parse('raise Exception("continue")').body -class ReplaceBreakContineWithExceptions(ast.NodeTransformer): +class ReplaceBreakContinueWithExceptions(ast.NodeTransformer): def visit_Break(self, node): return break_ast @@ -199,29 +236,32 @@ def visit_Continue(self, node): return continue_ast -def replace_break_continue(ast_module: ast.Module): - # Replace "break" and "continue" with custom exceptions. - # Otherwise SyntaxError is raised because these instructions - # are called outside a loop. - transformer = ReplaceBreakContineWithExceptions() - transformed_ast_module = transformer.visit(ast_module) - ast.fix_missing_locations(transformed_ast_module) - return compile(transformed_ast_module, filename="", mode="exec") - - class WhileLoop: """ Object to hold ast and test-function for a reloading while loop. """ - def __init__(self, ast_module: ast.Module, test: ast.Call, id: str): + def __init__(self, + ast_module: ast.Module, + test: ast.Call, + filename: str, + id: str): self.ast: ast.Module = ast_module self.test: ast.Call = test self.id: str = id - self.compiled_body = replace_break_continue(self.ast) + # Replace "break" and "continue" with custom exceptions. + # Otherwise SyntaxError is raised because these instructions + # are called outside a loop. + ReplaceBreakContinueWithExceptions().visit(ast_module) + ast.fix_missing_locations(ast_module) + self.compiled_body = compile(ast_module, + filename=filename, + mode="exec") # If no argument was supplied, then loop forever ast_condition = ast.Expression(body=ast.Constant(True)) if len(test.args) > 0: # Create expression to evaluate condition + # reloading only takes one argument, so we can + # pick the first element of the args. ast_condition = ast.Expression(body=test.args[0]) ast.fix_missing_locations(ast_condition) self.condition = compile(ast_condition, filename="", mode="eval") @@ -236,15 +276,23 @@ def __init__(self, iteration_variables: Union[ast.Name, ast.Tuple, ast.List], + filename: str, id: str): self.ast: ast.Module = ast_module + # Replace "break" and "continue" with custom exceptions. + # Otherwise SyntaxError is raised because these instructions + # are called outside a loop. + ReplaceBreakContinueWithExceptions().visit(ast_module) + ast.fix_missing_locations(ast_module) + self.compiled_body = compile(ast_module, + filename=filename, + mode="exec") self.iteration_variables: Union[ast.Name, ast.Tuple, ast.List] = iteration_variables self.iteration_variables_str: str = format_iteration_variables( iteration_variables) self.id: str = id - self.compiled_body = replace_break_continue(self.ast) def get_loop_object(loop_frame_info: inspect.FrameInfo, @@ -255,6 +303,7 @@ def get_loop_object(loop_frame_info: inspect.FrameInfo, Traverse AST for the entire reloaded file in a search for the loop which is reloaded. """ + Parentage().visit(reloaded_file_ast) candidates: List[Union[ast.For, ast.While]] = [] for node in ast.walk(reloaded_file_ast): if isinstance(node, ast.For) and isinstance(node.iter, ast.Call): @@ -273,7 +322,7 @@ def get_loop_object(loop_frame_info: inspect.FrameInfo, candidates.append(node) if len(candidates) == 0 and loop_id is None: - raise Exception("Reloading used outside the context of a loop.") + raise ReloadingException("Reloading used outside a loop.") elif len(candidates) == 0 and loop_id: raise ReloadingException( f'Unable to reload loop initially defined at line ' @@ -289,10 +338,16 @@ def sorting_function(candidate): loop_node_ast = ast.Module(candidate.body, type_ignores=[]) if isinstance(candidate, ast.For): assert isinstance(candidate.target, (ast.Name, ast.Tuple, ast.List)) - return ForLoop(loop_node_ast, candidate.target, get_loop_id(candidate)) + return ForLoop(loop_node_ast, + candidate.target, + filename, + get_loop_id(candidate)) elif isinstance(candidate, ast.While): assert isinstance(candidate.test, ast.Call) - return WhileLoop(loop_node_ast, candidate.test, get_loop_id(candidate)) + return WhileLoop(loop_node_ast, + candidate.test, + filename, + get_loop_id(candidate)) raise ReloadingException("No loop node found.") @@ -302,55 +357,69 @@ def get_loop_id(ast_node: Union[ast.For, ast.While]) -> str: Used to identify the loop in the changed source file. """ if isinstance(ast_node, ast.For): - return ast.dump(ast_node.target) + "__" + ast.dump(ast_node.iter) + return "_".join([get_node_id(ast_node), + ast.dump(ast_node.target), + ast.dump(ast_node.iter)]) elif isinstance(ast_node, ast.While): - return ast.dump(ast_node.test) + return "_".join([get_node_id(ast_node), + ast.dump(ast_node.test)]) def get_loop_code(loop_frame_info: inspect.FrameInfo, loop_id: Union[None, str], - filename: str) -> Union[WhileLoop, ForLoop]: + filename: str, + interactive_exception: bool) -> Union[WhileLoop, ForLoop]: while True: - reloaded_file_ast: ast.Module = parse_file_until_successful(filename) + reloaded_file_ast: ast.Module = parse_file_until_successful( + filename, + interactive_exception + ) try: return get_loop_object( loop_frame_info, reloaded_file_ast, filename, loop_id=loop_id ) except (LookupError, ReloadingException): - handle_exception(filename) + handle_exception(filename, interactive_exception=False) -def handle_exception(filename: str): +def handle_exception(filename: str, interactive_exception): """ Output helpful error message to user regarding exception in reloaded code. """ - exception = traceback.format_exc() - exception = exception.replace('File ""', f'File "{filename}"') - sys.stderr.write(exception + "\n") - - if sys.stdin.isatty(): - print( - f"An error occurred. Please edit the file '{filename}' to fix " - "the issue and press return to continue or Ctrl+C to exit." - ) + # Report traceback stack starting with the reloaded file. + # This avoids listing stack frames from this library. + # Source: https://stackoverflow.com/questions/45771299 + frame_summaries = traceback.extract_tb(sys.exc_info()[2]) + count = len(frame_summaries) + # find the first occurrence of the module file name + for i, frame_summary in enumerate(frame_summaries): + if frame_summary.filename == filename: + break + count -= 1 + exception_text = traceback.format_exc(limit=-count) + # Even though "filename" is passed to calls to compile, + # we still have to replace the filename when an error + # occours during compiling. + exception_text = exception_text.replace('File ""', + f'File "{filename}"') + exception_text = exception_text.replace('File ""', + f'File "{filename}"') + if sys.stdin.isatty() and interactive_exception: + log.error("Exception occourred. Press to continue " + "or to exit:\n" + exception_text) try: sys.stdin.readline() except KeyboardInterrupt: - print("\nExiting...") + log.info("\nExiting...") sys.exit(1) else: - # get error line number - line_number = int(exception.split(", line ")[-1].split(",")[0]) - print(line_number) - raise Exception( - 'An error occurred. Please fix the issue in the file' - f'"{filename}" and run the script again.' - ) + raise def execute_for_loop(seq: Iterable, loop_frame_info: inspect.FrameInfo, - filename: str): + filename: str, + interactive_exception: bool): caller_globals: Dict[str, Any] = loop_frame_info.frame.f_globals caller_locals: Dict[str, Any] = loop_frame_info.frame.f_locals @@ -358,9 +427,10 @@ def execute_for_loop(seq: Iterable, file_stat: int = 0 vacant_variable_name: str = "" assign_compiled = compile("", filename="", mode="exec") - for_loop = get_loop_code( - loop_frame_info, loop_id=None, filename=filename - ) + for_loop = get_loop_code(loop_frame_info, + None, + filename, + interactive_exception) for i, iteration_variable_values in enumerate(seq): # Reload code if possibly modified @@ -370,9 +440,10 @@ def execute_for_loop(seq: Iterable, log.info(f'For loop at line {loop_frame_info.lineno} of file ' f'"{filename}" has been reloaded.') ast_before = for_loop.ast - for_loop = get_loop_code( - loop_frame_info, loop_id=for_loop.id, filename=filename - ) + for_loop = get_loop_code(loop_frame_info, + for_loop.id, + filename, + interactive_exception) assert isinstance(for_loop, ForLoop) ast_after = for_loop.ast log.debug(get_diff_text(ast_before, ast_after)) @@ -380,7 +451,7 @@ def execute_for_loop(seq: Iterable, # Make up a name for a variable which is not already present in # the global or local namespace. vacant_variable_name = unique_name( - chain(caller_locals.keys(), caller_globals.keys()) + itertools.chain(caller_locals.keys(), caller_globals.keys()) ) # Reassign variable values from vacant variable in local scope assign = ast.Module([ @@ -405,17 +476,20 @@ def execute_for_loop(seq: Iterable, if exception.args == ("continue",): continue else: - handle_exception(filename) + handle_exception(filename, interactive_exception) -def execute_while_loop(loop_frame_info: inspect.FrameInfo, filename: str): +def execute_while_loop(loop_frame_info: inspect.FrameInfo, + filename: str, + interactive_exception: bool): caller_globals: Dict[str, Any] = loop_frame_info.frame.f_globals caller_locals: Dict[str, Any] = loop_frame_info.frame.f_locals file_stat: int = os.stat(filename).st_mtime_ns - while_loop = get_loop_code( - loop_frame_info, loop_id=None, filename=filename - ) + while_loop = get_loop_code(loop_frame_info, + None, + filename, + interactive_exception) def condition(while_loop): return eval(while_loop.condition, caller_globals, caller_locals) @@ -429,9 +503,10 @@ def condition(while_loop): log.info(f'While loop at line {loop_frame_info.lineno} of file ' f'"{filename}" has been reloaded.') ast_before = while_loop.ast - while_loop = get_loop_code( - loop_frame_info, loop_id=while_loop.id, filename=filename - ) + while_loop = get_loop_code(loop_frame_info, + while_loop.id, + filename, + interactive_exception) ast_after = while_loop.ast log.debug(get_diff_text(ast_before, ast_after)) file_stat = file_stat_ @@ -446,10 +521,11 @@ def condition(while_loop): if exception.args == ("continue",): continue else: - handle_exception(filename) + handle_exception(filename, interactive_exception) -def _reloading_loop(seq: Union[Iterable, bool]) -> Iterable: +def _reloading_loop(seq: Union[Iterable, bool], + interactive_exception) -> Iterable: stack: List[inspect.FrameInfo] = inspect.stack() # The first element on the stack is the caller of inspect.stack() # i.e. _reloading_loop @@ -465,15 +541,21 @@ def _reloading_loop(seq: Union[Iterable, bool]) -> Iterable: filename = str(loop_frame_info.frame.f_globals.get("__session__")) # Replace filename with Jupyter Notebook file name # if we are in a Jupyter Notebook session. - loop_object = get_loop_code( - loop_frame_info, loop_id=None, filename=filename - ) + loop_object = get_loop_code(loop_frame_info, + None, + filename, + interactive_exception) if isinstance(loop_object, ForLoop): assert isinstance(seq, Iterable) - execute_for_loop(seq, loop_frame_info, filename) + execute_for_loop(seq, + loop_frame_info, + filename, + interactive_exception) elif isinstance(loop_object, WhileLoop): - execute_while_loop(loop_frame_info, filename) + execute_while_loop(loop_frame_info, + filename, + interactive_exception) # If there is a third element, then it is the scope which called the loop. # If this is the main scope, then all is good. Howver, if we are in a @@ -564,6 +646,7 @@ def __init__(self, function_name: str, function_frame_info: inspect.FrameInfo, ast_module: ast.Module, + filename: str, id: str): self.ast = ast_module self.id = id @@ -577,7 +660,7 @@ def __init__(self, # Variables that are local to the calling scope # are global to the function. caller_globals_copy.update(caller_locals_copy) - compiled_body = compile(ast_module, filename="", mode="exec") + compiled_body = compile(ast_module, filename=filename, mode="exec") exec(compiled_body, caller_globals_copy, caller_locals_copy) self.function = caller_locals_copy[function_name] @@ -588,7 +671,7 @@ def get_function_object(function_frame_info: inspect.FrameInfo, filename: str, function_id: Union[None, str] = None) -> Function: """ - Traverse AST foar the entire reloaded file in a search for the + Traverse AST of the entire reloaded file in a search for the function (minus the reloading decorator) which is reloaded. """ qualname = function.__qualname__ @@ -633,29 +716,32 @@ def get_function_object(function_frame_info: inspect.FrameInfo, f'"{function_name}" and it is not possible ' f'to determine which to reload.') # Select the candidate node which is closest to function_frame_info - if candidate: - function_id = get_node_id(candidate) - function_node = strip_reloading_decorator(candidate) - function_node_ast = ast.Module([function_node], type_ignores=[]) - return Function(function.__name__, - function_frame_info, - function_node_ast, - function_id) - else: + if not candidate: raise ReloadingException( f'Unable to reload function "{function_name}" ' f'in file "{filename}". ' 'The function might have been renamed or the ' 'decorator might have been removed.' ) + function_id = get_node_id(candidate) + function_node = strip_reloading_decorator(candidate) + function_node_ast = ast.Module([function_node], type_ignores=[]) + return Function(function.__name__, + function_frame_info, + function_node_ast, + filename, + function_id) def get_reloaded_function(function_frame_info: inspect.FrameInfo, function: Callable, filename: str, - function_id: Union[None, str]) -> Function: + function_id: Union[None, str], + interactive_exception: bool) -> Function: reloaded_file_ast: ast.Module = parse_file_until_successful( - filename) + filename, + interactive_exception + ) return get_function_object(function_frame_info, function, reloaded_file_ast, @@ -663,16 +749,22 @@ def get_reloaded_function(function_frame_info: inspect.FrameInfo, function_id) -def _reloading_function(function: Callable) -> Callable: +def _reloading_function(function: Callable, + interactive_exception: bool) -> Callable: stack: List[inspect.FrameInfo] = inspect.stack() # The first element on the stack is the caller of inspect.stack() # That is, this very function. assert stack[0].function == "_reloading_function" - # The second element is the caller of the first, i.e. reloading - assert stack[1].function == "reloading" - # The third element or later is the function which called reloading - function_frame_info: inspect.FrameInfo = stack[2] - for frame_info in stack[2:]: + index = 2 + if stack[1].function == "reloading": + pass + elif stack[1].function == "wrap" and stack[2].function == "reloading": + index = 3 + # The third/fourth element or later is the function which called reloading. + # Assume it's the third. + function_frame_info: inspect.FrameInfo = stack[index] + # Look to see if theres a better frame in the stack. + for frame_info in stack[index:]: names_global = set(frame_info.frame.f_globals.keys()) names_local = set(frame_info.frame.f_locals.keys()) variables = names_local | names_global @@ -685,16 +777,16 @@ def _reloading_function(function: Callable) -> Callable: if ".ipynb" in function_frame_info.frame.f_globals.get("__session__", ""): filename = str(function_frame_info.frame.f_globals.get("__session__")) - caller_locals = function_frame_info.frame.f_locals file_stat: int = os.stat(filename).st_mtime_ns function_object = get_reloaded_function(function_frame_info, function, filename, - function_id=None) - i: int = 0 + None, + interactive_exception) + @functools.wraps(function) def wrapped(*args, **kwargs): - nonlocal file_stat, function, function_object, i + nonlocal file_stat, function_object # Reload code if possibly modified file_stat_: int = os.stat(filename).st_mtime_ns if file_stat != file_stat_: @@ -705,18 +797,15 @@ def wrapped(*args, **kwargs): function_object = get_reloaded_function(function_frame_info, function, filename, - function_object.id) + function_object.id, + interactive_exception) ast_after = function_object.ast log.debug(get_diff_text(ast_before, ast_after)) file_stat = file_stat_ - i += 1 while True: try: - result = function_object.function(*args, **kwargs) - return result + return function_object.function(*args, **kwargs) except Exception: - handle_exception(filename) + handle_exception(filename, interactive_exception) - wrapped.__signature__ = inspect.signature(function) # type: ignore - caller_locals[function.__name__] = wrapped return wrapped diff --git a/reloading/test_reloading.py b/reloading/test_reloading.py index 0518e46..9290773 100644 --- a/reloading/test_reloading.py +++ b/reloading/test_reloading.py @@ -46,7 +46,7 @@ def run_and_update_source(init_src, updated_src=None, update_after=0.5): class TestReloadingForLoopWithoutChanges(unittest.TestCase): def test_no_argument(self): i = 0 - for _ in reloading(): + for _ in reloading(): # type: ignore i += 1 if i > 10: break @@ -354,6 +354,121 @@ def g(): self.assertEqual(result, "999999") +class TestReloadingFunctionDecoratorArgumentsWithoutChanges(unittest.TestCase): + def test_empty_function_definition(self): + @reloading(interactive_exception=False) + def function1(): + pass + + @reloading() + def function2(): + pass + + def test_empty_function_run(self): + @reloading(interactive_exception=False) + def function(): + pass + + function() + + def test_module_import(self): + import reloading + + @reloading.reloading(interactive_exception=False) + def function(): + pass + + function() + + def test_function_return_value(self): + @reloading(interactive_exception=False) + def function(): + return "1" + + self.assertEqual(function(), "1") + + def test_nested_function(self): + def outer(): + @reloading(interactive_exception=False) + def inner(): + return "3" + return inner() + + self.assertEqual(outer(), "3") + + def test_function_signature_is_preserved(self): + @reloading(interactive_exception=False) + def some_func(a, b, c): + return "4" + + import inspect + self.assertEqual(str(inspect.signature(some_func)), "(a, b, c)") + self.assertEqual(some_func(1, 2, 3), "4") + + def test_decorated_function(self): + def decorator(f): + def wrap(): + return "<"+str(f())+">" + return wrap + + @decorator + @reloading(interactive_exception=False) + def f(): + return 6 + + self.assertEqual(f(), "<6>") + + def test_reloading_function_in_library(self): + with open("temporary_library.py", "w") as f: + f.write(""" +from reloading import reloading + +@reloading(interactive_exception=False) +def function_marked(x): + return x +""") + import temporary_library # type: ignore + importlib.reload(temporary_library) + self.assertEqual(temporary_library.function_marked("9"), "9") + if os.path.isfile("temporary_library.py"): + os.remove("temporary_library.py") + + def test_deep_call_stack_make_locals_globals(self): + a = 2 + + @reloading(interactive_exception=False) + def f(x): + b = 2 + return x*a*b + + def g(): + return f + + function = g() + result = function("9") + + self.assertEqual(result, "9999") + + def test_deep_call_stack_prioritise_locals(self): + a = 2 + # Now flake8 does not complain about unused a + print(a) + + @reloading(interactive_exception=False) + def f(x): + a = 3 + b = 2 + return x*a*b + + def g(): + return f + + function = g() + result = function("9") + + self.assertEqual(result, "999999") + + class TestReloadingForLoopWithChanges(unittest.TestCase): def test_changing_source_loop(self): code = """ From 495e06150ca2f4cf6281585d72c12c76a41593a4 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Fri, 3 Jan 2025 22:06:27 +0100 Subject: [PATCH 63/65] Editorial changes. --- reloading/reloading.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/reloading/reloading.py b/reloading/reloading.py index 452dbdd..9acb2dc 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -187,7 +187,7 @@ def load_file(filename: str) -> str: """ src = "" while True: - with open(filename, "r") as f: + with open(filename, "r", encoding="utf-8") as f: if filename.endswith(".ipynb"): import nbformat # Read Jupyter Notebook v. 4 @@ -244,10 +244,10 @@ def __init__(self, ast_module: ast.Module, test: ast.Call, filename: str, - id: str): + node_id: str): self.ast: ast.Module = ast_module self.test: ast.Call = test - self.id: str = id + self.id: str = node_id # Replace "break" and "continue" with custom exceptions. # Otherwise SyntaxError is raised because these instructions # are called outside a loop. @@ -277,7 +277,7 @@ def __init__(self, ast.Tuple, ast.List], filename: str, - id: str): + node_id: str): self.ast: ast.Module = ast_module # Replace "break" and "continue" with custom exceptions. # Otherwise SyntaxError is raised because these instructions @@ -292,7 +292,7 @@ def __init__(self, ast.List] = iteration_variables self.iteration_variables_str: str = format_iteration_variables( iteration_variables) - self.id: str = id + self.id: str = node_id def get_loop_object(loop_frame_info: inspect.FrameInfo, @@ -392,7 +392,7 @@ def handle_exception(filename: str, interactive_exception): frame_summaries = traceback.extract_tb(sys.exc_info()[2]) count = len(frame_summaries) # find the first occurrence of the module file name - for i, frame_summary in enumerate(frame_summaries): + for frame_summary in frame_summaries: if frame_summary.filename == filename: break count -= 1 @@ -647,9 +647,9 @@ def __init__(self, function_frame_info: inspect.FrameInfo, ast_module: ast.Module, filename: str, - id: str): + node_id: str): self.ast = ast_module - self.id = id + self.id = node_id self.name = function_name caller_locals = function_frame_info.frame.f_locals caller_globals = function_frame_info.frame.f_globals From 458dfa906570f2744b70f2d1171591c36e4b8fb2 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Sat, 4 Jan 2025 19:29:26 +0100 Subject: [PATCH 64/65] Avoid setting encoding when reloading. --- reloading/reloading.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reloading/reloading.py b/reloading/reloading.py index 9acb2dc..bff2a80 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -187,7 +187,7 @@ def load_file(filename: str) -> str: """ src = "" while True: - with open(filename, "r", encoding="utf-8") as f: + with open(filename, "r") as f: if filename.endswith(".ipynb"): import nbformat # Read Jupyter Notebook v. 4 From 50657191f1b01f380fbb648e3fb4fc18e5a1d6a3 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Sun, 5 Jan 2025 20:25:07 +0100 Subject: [PATCH 65/65] Added missing type overloads. --- reloading/reloading.py | 23 +++++++++++++++++++---- reloading/test_reloading.py | 15 +++++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/reloading/reloading.py b/reloading/reloading.py index bff2a80..16e9a16 100644 --- a/reloading/reloading.py +++ b/reloading/reloading.py @@ -54,7 +54,8 @@ def reloading(fn_or_seq_or_bool: Iterable) -> Iterable: ... @overload -def reloading(fn_or_seq_or_bool: None) -> Iterable: ... +def reloading(fn_or_seq_or_bool: Iterable, + interactive_exception: bool) -> Iterable: ... @overload @@ -62,15 +63,29 @@ def reloading(fn_or_seq_or_bool: bool) -> Iterable: ... @overload -def reloading(*, interactive_exception: bool) -> Callable: ... +def reloading(fn_or_seq_or_bool: bool, + interactive_exception: bool) -> Iterable: ... @overload -def reloading() -> Callable: ... +def reloading(fn_or_seq_or_bool: Callable) -> Callable: ... @overload -def reloading(fn_or_seq_or_bool: Callable) -> Callable: ... +def reloading(fn_or_seq_or_bool: Callable, + interactive_exception: bool) -> Callable: ... + + +@overload +def reloading(fn_or_seq_or_bool: None) -> Iterable: ... + + +@overload +def reloading(*, interactive_exception: bool) -> Callable: ... + + +@overload +def reloading() -> Callable: ... def reloading(fn_or_seq_or_bool: Optional[ diff --git a/reloading/test_reloading.py b/reloading/test_reloading.py index 9290773..162cddc 100644 --- a/reloading/test_reloading.py +++ b/reloading/test_reloading.py @@ -58,6 +58,10 @@ def test_range_pass(self): for _ in reloading(range(10)): pass + def test_range_pass_not_interactive(self): + for _ in reloading(range(10), interactive_exception=False): + pass + def test_module_import(self): import reloading for _ in reloading.reloading(range(10)): @@ -135,6 +139,11 @@ def test_no_argument(self): if sys.version_info.major >= 3 and sys.version_info.minor >= 13: self.assertEqual(i, 10) + def test_not_interactive(self): + i = 0 + while reloading(i < 10, interactive_exception=False): + i += 1 + def test_false(self): i = 0 while reloading(False): @@ -230,6 +239,12 @@ def function(): function = reloading(function) + def test_empty_function_wrapped_not_interactive(self): + def function(): + pass + + function = reloading(function, interactive_exception=False) + def test_empty_function_run(self): @reloading def function():