Removed ImageMath eval and options parameters

This commit is contained in:
Andrew Murray 2025-07-01 20:35:12 +10:00
parent 0a29d6392a
commit 4301c1fde6
4 changed files with 22 additions and 95 deletions

View File

@ -2,8 +2,6 @@ from __future__ import annotations
from typing import Any from typing import Any
import pytest
from PIL import Image, ImageMath from PIL import Image, ImageMath
@ -55,11 +53,6 @@ def test_sanity() -> None:
) )
def test_options_deprecated() -> None:
with pytest.warns(DeprecationWarning, match="ImageMath.lambda_eval options"):
assert ImageMath.lambda_eval(lambda args: 1, images) == 1
def test_ops() -> None: def test_ops() -> None:
assert pixel(ImageMath.lambda_eval(lambda args: args["A"] * -1, **images)) == "I -1" assert pixel(ImageMath.lambda_eval(lambda args: args["A"] * -1, **images)) == "I -1"

View File

@ -35,16 +35,6 @@ def test_sanity() -> None:
assert pixel(ImageMath.unsafe_eval("int(float(A)+B)", **images)) == "I 3" assert pixel(ImageMath.unsafe_eval("int(float(A)+B)", **images)) == "I 3"
def test_eval_deprecated() -> None:
with pytest.warns(DeprecationWarning, match="ImageMath.eval"):
assert ImageMath.eval("1") == 1
def test_options_deprecated() -> None:
with pytest.warns(DeprecationWarning, match="ImageMath.unsafe_eval options"):
assert ImageMath.unsafe_eval("1", images) == 1
def test_ops() -> None: def test_ops() -> None:
assert pixel(ImageMath.unsafe_eval("-A", **images)) == "I -1" assert pixel(ImageMath.unsafe_eval("-A", **images)) == "I -1"
assert pixel(ImageMath.unsafe_eval("+B", **images)) == "L 2" assert pixel(ImageMath.unsafe_eval("+B", **images)) == "L 2"

View File

@ -49,14 +49,6 @@ Deprecated Use instead
:py:data:`sys.version_info`, and ``PIL.__version__`` :py:data:`sys.version_info`, and ``PIL.__version__``
============================================ ==================================================== ============================================ ====================================================
ImageMath eval()
^^^^^^^^^^^^^^^^
.. deprecated:: 10.3.0
``ImageMath.eval()`` has been deprecated. Use :py:meth:`~PIL.ImageMath.lambda_eval` or
:py:meth:`~PIL.ImageMath.unsafe_eval` instead.
Non-image modes in ImageCms Non-image modes in ImageCms
^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -94,15 +86,6 @@ ICNS (width, height, scale) sizes
Setting an ICNS image size to ``(width, height, scale)`` before loading has been Setting an ICNS image size to ``(width, height, scale)`` before loading has been
deprecated. Instead, ``load(scale)`` can be used. deprecated. Instead, ``load(scale)`` can be used.
ImageMath.lambda_eval and ImageMath.unsafe_eval options parameter
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. deprecated:: 11.0.0
The ``options`` parameter in :py:meth:`~PIL.ImageMath.lambda_eval()` and
:py:meth:`~PIL.ImageMath.unsafe_eval()` has been deprecated. One or more keyword
arguments can be used instead.
ExifTags.IFD.Makernote ExifTags.IFD.Makernote
^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^
@ -179,6 +162,16 @@ Image isImageType()
``Image.isImageType(im)`` has been removed. Use ``isinstance(im, Image.Image)`` ``Image.isImageType(im)`` has been removed. Use ``isinstance(im, Image.Image)``
instead. instead.
ImageMath.lambda_eval and ImageMath.unsafe_eval options parameter
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. deprecated:: 11.0.0
.. versionremoved:: 12.0.0
The ``options`` parameter in :py:meth:`~PIL.ImageMath.lambda_eval()` and
:py:meth:`~PIL.ImageMath.unsafe_eval()` has been removed. One or more keyword
arguments can be used instead.
JpegImageFile.huffman_ac and JpegImageFile.huffman_dc JpegImageFile.huffman_ac and JpegImageFile.huffman_dc
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -208,6 +201,15 @@ removed. They were used for obtaining raw pointers to ``ImagingCore`` internals.
interact with C code, you can use ``Image.Image.getim()``, which returns a ``Capsule`` interact with C code, you can use ``Image.Image.getim()``, which returns a ``Capsule``
object. object.
ImageMath eval()
^^^^^^^^^^^^^^^^
.. deprecated:: 10.3.0
.. versionremoved:: 12.0.0
``ImageMath.eval()`` has been removed. Use :py:meth:`~PIL.ImageMath.lambda_eval` or
:py:meth:`~PIL.ImageMath.unsafe_eval` instead.
BGR;15, BGR 16 and BGR;24 BGR;15, BGR 16 and BGR;24
^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -21,7 +21,6 @@ from types import CodeType
from typing import Any, Callable from typing import Any, Callable
from . import Image, _imagingmath from . import Image, _imagingmath
from ._deprecate import deprecate
class _Operand: class _Operand:
@ -233,11 +232,7 @@ ops = {
} }
def lambda_eval( def lambda_eval(expression: Callable[[dict[str, Any]], Any], **kw: Any) -> Any:
expression: Callable[[dict[str, Any]], Any],
options: dict[str, Any] = {},
**kw: Any,
) -> Any:
""" """
Returns the result of an image function. Returns the result of an image function.
@ -246,23 +241,13 @@ def lambda_eval(
:py:func:`~PIL.Image.merge` function. :py:func:`~PIL.Image.merge` function.
:param expression: A function that receives a dictionary. :param expression: A function that receives a dictionary.
:param options: Values to add to the function's dictionary. Deprecated.
You can instead use one or more keyword arguments.
:param **kw: Values to add to the function's dictionary. :param **kw: Values to add to the function's dictionary.
:return: The expression result. This is usually an image object, but can :return: The expression result. This is usually an image object, but can
also be an integer, a floating point value, or a pixel tuple, also be an integer, a floating point value, or a pixel tuple,
depending on the expression. depending on the expression.
""" """
if options:
deprecate(
"ImageMath.lambda_eval options",
12,
"ImageMath.lambda_eval keyword arguments",
)
args: dict[str, Any] = ops.copy() args: dict[str, Any] = ops.copy()
args.update(options)
args.update(kw) args.update(kw)
for k, v in args.items(): for k, v in args.items():
if isinstance(v, Image.Image): if isinstance(v, Image.Image):
@ -275,11 +260,7 @@ def lambda_eval(
return out return out
def unsafe_eval( def unsafe_eval(expression: str, **kw: Any) -> Any:
expression: str,
options: dict[str, Any] = {},
**kw: Any,
) -> Any:
""" """
Evaluates an image expression. This uses Python's ``eval()`` function to process Evaluates an image expression. This uses Python's ``eval()`` function to process
the expression string, and carries the security risks of doing so. It is not the expression string, and carries the security risks of doing so. It is not
@ -291,29 +272,19 @@ def unsafe_eval(
:py:func:`~PIL.Image.merge` function. :py:func:`~PIL.Image.merge` function.
:param expression: A string containing a Python-style expression. :param expression: A string containing a Python-style expression.
:param options: Values to add to the evaluation context. Deprecated.
You can instead use one or more keyword arguments.
:param **kw: Values to add to the evaluation context. :param **kw: Values to add to the evaluation context.
:return: The evaluated expression. This is usually an image object, but can :return: The evaluated expression. This is usually an image object, but can
also be an integer, a floating point value, or a pixel tuple, also be an integer, a floating point value, or a pixel tuple,
depending on the expression. depending on the expression.
""" """
if options:
deprecate(
"ImageMath.unsafe_eval options",
12,
"ImageMath.unsafe_eval keyword arguments",
)
# build execution namespace # build execution namespace
args: dict[str, Any] = ops.copy() args: dict[str, Any] = ops.copy()
for k in [*options, *kw]: for k in kw:
if "__" in k or hasattr(builtins, k): if "__" in k or hasattr(builtins, k):
msg = f"'{k}' not allowed" msg = f"'{k}' not allowed"
raise ValueError(msg) raise ValueError(msg)
args.update(options)
args.update(kw) args.update(kw)
for k, v in args.items(): for k, v in args.items():
if isinstance(v, Image.Image): if isinstance(v, Image.Image):
@ -337,32 +308,3 @@ def unsafe_eval(
return out.im return out.im
except AttributeError: except AttributeError:
return out return out
def eval(
expression: str,
_dict: dict[str, Any] = {},
**kw: Any,
) -> Any:
"""
Evaluates an image expression.
Deprecated. Use lambda_eval() or unsafe_eval() instead.
:param expression: A string containing a Python-style expression.
:param _dict: Values to add to the evaluation context. You
can either use a dictionary, or one or more keyword
arguments.
:return: The evaluated expression. This is usually an image object, but can
also be an integer, a floating point value, or a pixel tuple,
depending on the expression.
.. deprecated:: 10.3.0
"""
deprecate(
"ImageMath.eval",
12,
"ImageMath.lambda_eval or ImageMath.unsafe_eval",
)
return unsafe_eval(expression, _dict, **kw)