diff --git a/saqc/core/core.py b/saqc/core/core.py index 3cf2709ec5b9bb3cf9a1bca75f9a03662e548677..02d882658d9a69ef5645cdadbdaa39806af02aeb 100644 --- a/saqc/core/core.py +++ b/saqc/core/core.py @@ -9,7 +9,7 @@ from __future__ import annotations import logging import copy as stdcopy from saqc.lib.tools import toSequence -from typing import Tuple, Sequence, Union, Optional +from typing import Tuple, Union, Optional from typing_extensions import Literal import inspect @@ -22,7 +22,6 @@ from saqc.core.flags import initFlagsLike, Flags from saqc.core.lib import APIController, ColumnSelector from saqc.core.register import FUNC_MAP, SaQCFunction from saqc.core.modules import FuncModules -from saqc.funcs.tools import copy from saqc.lib.plotting import plotHook, plotAllHook from saqc.core.translator.basetranslator import Translator, FloatTranslator from saqc.lib.types import ExternalFlag, CallGraph, MaterializedGraph, PandasLike @@ -222,10 +221,10 @@ class SaQC(FuncModules): logger.debug( f"processing: {selector.field}, {function.name}, {function.keywords}" ) + assert data.columns.difference(flags.columns).empty + try: - data_result, flags_result = _saqcCallFunc( - selector, control, function, data, flags - ) + data_result, flags_result = function(data, selector.field, flags) # we check the passed function-kwargs after the actual call, # because now "hard" errors would already have been raised # (eg. `TypeError: got multiple values for argument 'data'`, @@ -303,11 +302,19 @@ class SaQC(FuncModules): fields = self._data.columns.str.match(field) if regex else toSequence(field) for field in fields: - locator = ColumnSelector( - field=field, - target=target if target is not None else field, - ) - out._planned.append((locator, control, partial)) + target = target if target is not None else field + if field != target: + copy_func = FUNC_MAP["tools.copy"] + out._planned.append( + ( + ColumnSelector(field, target), + control, + copy_func.bind(new_field=target), + ) + ) + field = target + + out._planned.append((ColumnSelector(field, target), control, partial)) if self._lazy: return out @@ -333,24 +340,6 @@ class SaQC(FuncModules): return stdcopy.copy(self) -def _saqcCallFunc(locator, controller, function, data, flags): - # NOTE: - # We assure that all columns in data have an equivalent column in flags, - # we might have more flags columns though - assert data.columns.difference(flags.columns).empty - - field = locator.field - target = locator.target - - if target != field: - data, flags = copy(data, field, flags, target) - field = target - - data_result, flags_result = function(data, field, flags) - - return data_result, flags_result - - def _warnForUnusedKwargs(func, translator: Translator): """Warn for unused kwargs, passed to a SaQC.function.