コード例 #1
0
    def _set_function_string(self, obj, name, old, new):
        if name == 'function_str':
            self.inputs.function_str_hash = ''

            if self.as_module:
                module = inspect.getmodule(new).__name__
                full_name = "%s.%s" % (module, new.__name__)
                self.inputs.function_str = full_name
                self.inputs.function_str_hash = hashlib.md5(
                    getsource(new)).hexdigest()
            elif hasattr(new, '__call__'):
                function_source = getsource(new)
                fninfo = new.__code__
            elif isinstance(new, (str, bytes)):
                function_source = new
                fninfo = create_function_from_source(new,
                                                     self.imports).__code__

            self.inputs.trait_set(trait_change_notify=False,
                                  **{'%s' % name: function_source})

            # Update input traits
            input_names = fninfo.co_varnames[:fninfo.co_argcount]
            new_names = set(input_names) - set(self._input_names)
            add_traits(self.inputs, list(new_names))
            self._input_names.extend(new_names)
コード例 #2
0
def test_func_to_str():
    def func1(x):
        return x**2

    # Should be ok with both functions!
    for f in _func1, func1:
        f_src = getsource(f)
        f_recreated = create_function_from_source(f_src)
        assert f(2.3) == f_recreated(2.3)
コード例 #3
0
ファイル: function.py プロジェクト: FCP-INDI/C-PAC
 def _set_function_string(self, obj, name, old, new):
     if name == 'function_str':
         if self.as_module:
             module = inspect.getmodule(new).__name__
             full_name = "%s.%s" % (module, new.__name__)
             self.inputs.function_str = full_name
         elif hasattr(new, '__call__'):
             function_source = getsource(new)
             fninfo = new.__code__
         elif isinstance(new, (str, bytes)):
             function_source = new
             fninfo = create_function_from_source(new,
                                                  self.imports).__code__
         self.inputs.trait_set(
             trait_change_notify=False, **{
                 '%s' % name: function_source
             })
         # Update input traits
         input_names = fninfo.co_varnames[:fninfo.co_argcount]
         new_names = set(input_names) - set(self._input_names)
         add_traits(self.inputs, list(new_names))
         self._input_names.extend(new_names)
コード例 #4
0
ファイル: test_functions.py プロジェクト: mfalkiewicz/nipype
def test_func_print_py2():
    wrapped_func = create_function_from_source(getsource(_print_statement))
    assert wrapped_func()
コード例 #5
0
ファイル: test_functions.py プロジェクト: mfalkiewicz/nipype
def test_func_string():
    def is_string():
        return isinstance('string', str)

    wrapped_func = create_function_from_source(getsource(is_string))
    assert is_string() == wrapped_func()
コード例 #6
0
ファイル: function.py プロジェクト: FCP-INDI/C-PAC
    def __init__(self,
                 input_names=None,
                 output_names='out',
                 function=None,
                 imports=None,
                 as_module=False,
                 **inputs):
        """

        Parameters
        ----------

        input_names: single str or list or None
            names corresponding to function inputs
            if ``None``, derive input names from function argument names
        output_names: single str or list
            names corresponding to function outputs (default: 'out').
            if list of length > 1, has to match the number of outputs
        function : callable
            callable python object. must be able to execute in an
            isolated namespace (possibly in concert with the ``imports``
            parameter)
        imports : list of strings
            list of import statements that allow the function to execute
            in an otherwise empty namespace
        """

        super(Function, self).__init__(**inputs)
        if function:
            if as_module:
                module = inspect.getmodule(function).__name__
                full_name = "%s.%s" % (module, function.__name__)
                self.inputs.function_str = full_name
            elif hasattr(function, '__call__'):
                try:
                    self.inputs.function_str = getsource(function)
                except IOError:
                    raise Exception('Interface Function does not accept '
                                    'function objects defined interactively '
                                    'in a python session')
                else:
                    if input_names is None:
                        fninfo = function.__code__
            elif isinstance(function, (str, bytes)):
                self.inputs.function_str = function
                if input_names is None:
                    fninfo = create_function_from_source(function,
                                                         imports).__code__
            else:
                raise Exception('Unknown type of function')
            if input_names is None:
                input_names = fninfo.co_varnames[:fninfo.co_argcount]

        self.as_module = as_module
        self.inputs.on_trait_change(self._set_function_string, 'function_str')
        self._input_names = ensure_list(input_names)
        self._output_names = ensure_list(output_names)
        add_traits(self.inputs, [name for name in self._input_names])
        self.imports = imports
        self._out = {}
        for name in self._output_names:
            self._out[name] = None
コード例 #7
0
def test_func_print_py2():
    wrapped_func = create_function_from_source(getsource(_print_statement))
    assert wrapped_func()
コード例 #8
0
def test_func_string():
    def is_string():
        return isinstance('string', str)

    wrapped_func = create_function_from_source(getsource(is_string))
    assert is_string() == wrapped_func()
コード例 #9
0
ファイル: function.py プロジェクト: mjboos/C-PAC
    def __init__(self,
                 input_names=None,
                 output_names='out',
                 function=None,
                 imports=None,
                 as_module=False,
                 **inputs):
        """

        Parameters
        ----------

        input_names: single str or list or None
            names corresponding to function inputs
            if ``None``, derive input names from function argument names
        output_names: single str or list
            names corresponding to function outputs (default: 'out').
            if list of length > 1, has to match the number of outputs
        function : callable
            callable python object. must be able to execute in an
            isolated namespace (possibly in concert with the ``imports``
            parameter)
        imports : list of strings
            list of import statements that allow the function to execute
            in an otherwise empty namespace
        """

        super(Function, self).__init__(**inputs)
        if function:
            if as_module:
                module = inspect.getmodule(function).__name__
                full_name = "%s.%s" % (module, function.__name__)
                self.inputs.function_str = full_name
            elif hasattr(function, '__call__'):
                try:
                    self.inputs.function_str = getsource(function)
                except IOError:
                    raise Exception('Interface Function does not accept '
                                    'function objects defined interactively '
                                    'in a python session')
                else:
                    if input_names is None:
                        fninfo = function.__code__
            elif isinstance(function, (str, bytes)):
                self.inputs.function_str = function
                if input_names is None:
                    fninfo = create_function_from_source(function,
                                                         imports).__code__
            else:
                raise Exception('Unknown type of function')
            if input_names is None:
                input_names = fninfo.co_varnames[:fninfo.co_argcount]

        self.as_module = as_module
        self.inputs.on_trait_change(self._set_function_string, 'function_str')
        self._input_names = ensure_list(input_names)
        self._output_names = ensure_list(output_names)
        add_traits(self.inputs, [name for name in self._input_names])
        self.imports = imports
        self._out = {}
        for name in self._output_names:
            self._out[name] = None