Source code for ovl.partials.keyword_partial
import functools
import warnings
from .reverse_partial import ReversePartial
[docs]def keyword_partial(target_function):
"""
A Decorator used to load other parameters to a function before applying it on a given input data
This decorator is used to load parameters to the filter function, image processing filters, morphological functions
sorters and other functions that act similarly.
Preloading a function consists of pass all arguments except the first,
which is then passed when the function is called.
Example:
For a given function:
.. code-block:: python
@keyword_partial
def area_filter(contours, min_area, max_area):
output_list = []
ratio_list = []
if type(contour_list) is not list:
contour_list = [contour_list]
for current_contour in contour_list:
if min_area <= cv2.contourArea(current_contour) <= max_area:
output_list.append(current_contour)
ratio_list.append(current_contour)
return output_list, ratio_list
Instead of calling the function like other functions:
.. code-block:: python
area_filter(list_of_contours, min_area=200, max_area=5000)
The function needs to be called as follows:
.. code-block:: python
activator = area_filter(min_area=200, max_area=5000)
final_value = activator(list_of_contours)
Vision objects use functions that are decorated with keyword_partial (contour_filter, image_filter,
you can just pass the activator to the Vision object like so:
.. code-block:: python
target_filters = [some_filter(parameter1=5, parameter2=3), ovl.circle_filter(min_area_ratio=0.75)]
vision = Vision(..., contours_filters=target_filters, ...)
:param target_function: the function to be preloaded
:return: a function (argument loader) that preloads (passes only some of the arguments)
the wrapped function (target_function)
"""
def argument_loader(*args, **kwargs):
if args != ():
warning_message = ("When passing parameters it is recommended to pass everything as keywords "
"in order to make it clear what parameters are passed."
"(Do: {0}(parameter1=value2, parameter2=value2) not {0}(value, value2))"
.format(target_function.__name__))
warnings.warn(warning_message, SyntaxWarning)
partial_function = ReversePartial(target_function, *args, **kwargs)
return functools.update_wrapper(partial_function, target_function)
wrapped_argument_loader = functools.update_wrapper(argument_loader, target_function)
return wrapped_argument_loader