Skip to content

Note

Click here to download the full example code

napari forward reference demo#

Example of using a ForwardRef to avoid importing a module that provides a widget.

In this example, one might want to create a widget that takes as an argument a napari Image layer, and returns an Image. In order to avoid needing to import napari (and therefore depending directly on napari), it's possible to annotate those parameters with a string representation of the type (rather than the type itself). This is called a "forward reference": https://www.python.org/dev/peps/pep-0484/#forward-references

napari forward refs

Out:

<FunctionGui subtract_background(data: napari.types.ImageData = None, background: int = 50) -> napari.types.ImageData>


# Note: if you'd like to avoid circular imports, or just want to avoid having your
# linter yell at you for an undefined type annotation, you can place the import
# inside of an `if typing.TYPE_CHECKING` conditional.  This is not evaluated at runtime,
# only when something like mypy is doing type checking.
from typing import TYPE_CHECKING

from magicgui import magicgui

if TYPE_CHECKING:
    import napari


@magicgui(call_button="execute", background={"max": 200})
def subtract_background(
    data: "napari.types.ImageData", background: int = 50
) -> "napari.types.ImageData":
    """Subtract a constant from the data."""
    if data:
        return data - background


subtract_background.show(run=True)
# now, this example isn't all that interesting on its own (since there will be no Image
# layer in the dropdown) ... but in another package, where you DO import napari,
# you could add this widget to a napari viewer with
# viewer.window.add_dock_widget(subtract_background)

Total running time of the script: ( 0 minutes 0.050 seconds)

Download Python source code: napari_forward_refs.py

Download Jupyter notebook: napari_forward_refs.ipynb

Gallery generated by mkdocs-gallery