tmp
/
pip-install-ghxuqwgs
/numpy_78e94bf2b6094bf9a1f3d92042f9bf46
/doc
/source
/f2py
/signature-file.rst
| ================== | |
| Signature file | |
| ================== | |
| The syntax specification for signature files (.pyf files) is borrowed | |
| from the Fortran 90/95 language specification. Almost all Fortran | |
| 90/95 standard constructs are understood, both in free and fixed | |
| format (recall that Fortran 77 is a subset of Fortran 90/95). F2PY | |
| introduces also some extensions to Fortran 90/95 language | |
| specification that help designing Fortran to Python interface, make it | |
| more "Pythonic". | |
| Signature files may contain arbitrary Fortran code (so that Fortran | |
| codes can be considered as signature files). F2PY silently ignores | |
| Fortran constructs that are irrelevant for creating the interface. | |
| However, this includes also syntax errors. So, be careful not making | |
| ones;-). | |
| In general, the contents of signature files is case-sensitive. When | |
| scanning Fortran codes and writing a signature file, F2PY lowers all | |
| cases automatically except in multiline blocks or when ``--no-lower`` | |
| option is used. | |
| The syntax of signature files is overvied below. | |
| Python module block | |
| ===================== | |
| A signature file may contain one (recommended) or more ``python | |
| module`` blocks. ``python module`` block describes the contents of | |
| a Python/C extension module ``<modulename>module.c`` that F2PY | |
| generates. | |
| Exception: if ``<modulename>`` contains a substring ``__user__``, then | |
| the corresponding ``python module`` block describes the signatures of | |
| so-called call-back functions (see :ref:`Call-back arguments`). | |
| A ``python module`` block has the following structure:: | |
| python module <modulename> | |
| ... | |
| [ | |
| interface | |
| <usercode statement> | |
| <Fortran block data signatures> | |
| <Fortran/C routine signatures> | |
| end [interface] | |
| ]... | |
| [ | |
| interface | |
| module <F90 modulename> | |
| end [module ] | |
| end [interface] | |
| ]... | |
| end [python module ] | |
| Here brackets ``[]`` indicate a optional part, dots ``...`` indicate | |
| one or more of a previous part. So, ``[]...`` reads zero or more of a | |
| previous part. | |
| Fortran/C routine signatures | |
| ============================= | |
| The signature of a Fortran routine has the following structure:: | |
| function | subroutine <routine name> \ | |
| [ ( ) ] [ result ( <entityname> ) ] | |
| end [ function | subroutine ] | |
| From a Fortran routine signature F2PY generates a Python/C extension | |
| function that has the following signature:: | |
| def <routine name>(<required arguments>[,<optional arguments>]): | |
| ... | |
| return <return variables> | |
| The signature of a Fortran block data has the following structure:: | |
| block data [ <block data name> ] | |
| end [ block data ] | |
| Type declarations | |
| ----------------- | |
| The definition of the ``<argument/variable type declaration>`` part | |
| is | |
| :: | |
| <typespec> [ :: ] <entitydecl> | |
| where | |
| :: | |
| <typespec> := byte | character | |
| | complex | real | |
| | double complex | double precision | |
| | integer | logical | |
| <charselector> := * <charlen> | |
| | ( [len=] <len> [ , [kind=] <kind>] ) | |
| | ( kind= <kind> [ , len= <len> ] ) | |
| <kindselector> := * <intlen> | ( [kind=] <kind> ) | |
| <entitydecl> := <name> [ [ * <charlen> ] [ ( <arrayspec> ) ] | |
| | [ ( <arrayspec> ) ] * <charlen> ] | |
| | [ / <init_expr> / | = <init_expr> ] \ | |
| [ , <entitydecl> ] | |
| and | |
| + ``<attrspec>`` is a comma separated list of attributes_; | |
| + ``<arrayspec>`` is a comma separated list of dimension bounds; | |
| + ``<init_expr>`` is a `C expression`__. | |
| + ``<intlen>`` may be negative integer for ``integer`` type | |
| specifications. In such cases ``integer*<negintlen>`` represents | |
| unsigned C integers. | |
| __ `C expressions`_ | |
| If an argument has no ``<argument type declaration>``, its type is | |
| determined by applying ``implicit`` rules to its name. | |
| Statements | |
| ---------- | |
| Attribute statements: | |
| The ``<argument/variable attribute statement>`` is | |
| ``<argument/variable type declaration>`` without ``<typespec>``. | |
| In addition, in an attribute statement one cannot use other | |
| attributes, also ``<entitydecl>`` can be only a list of names. | |
| Use statements: | |
| The definition of the ``<use statement>`` part is | |
| :: | |
| use <modulename> [ , <rename_list> | , ONLY : <only_list> ] | |
| where | |
| :: | |
| <rename_list> := <local_name> => <use_name> [ , <rename_list> ] | |
| Currently F2PY uses ``use`` statement only for linking call-back | |
| modules and ``external`` arguments (call-back functions), see | |
| :ref:`Call-back arguments`. | |
| Common block statements: | |
| The definition of the ``<common block statement>`` part is | |
| :: | |
| common / <common name> / <shortentitydecl> | |
| where | |
| :: | |
| <shortentitydecl> := <name> [ ( <arrayspec> ) ] [ , <shortentitydecl> ] | |
| One ``python module`` block should not contain two or more | |
| ``common`` blocks with the same name. Otherwise, the latter ones are | |
| ignored. The types of variables in ``<shortentitydecl>`` are defined | |
| using ``<argument type declarations>``. Note that the corresponding | |
| ``<argument type declarations>`` may contain array specifications; | |
| then you don't need to specify these in ``<shortentitydecl>``. | |
| Other statements: | |
| The ``<other statement>`` part refers to any other Fortran language | |
| constructs that are not described above. F2PY ignores most of them | |
| except | |
| + ``call`` statements and function calls of ``external`` arguments | |
| (`more details`__?); | |
| __ external_ | |
| + ``include`` statements | |
| :: | |
| include '<filename>' | |
| include "<filename>" | |
| If a file ``<filename>`` does not exist, the ``include`` | |
| statement is ignored. Otherwise, the file ``<filename>`` is | |
| included to a signature file. ``include`` statements can be used | |
| in any part of a signature file, also outside the Fortran/C | |
| routine signature blocks. | |
| + ``implicit`` statements | |
| :: | |
| implicit none | |
| implicit <list of implicit maps> | |
| where | |
| :: | |
| <implicit map> := <typespec> ( <list of letters or range of letters> ) | |
| Implicit rules are used to determine the type specification of | |
| a variable (from the first-letter of its name) if the variable | |
| is not defined using ``<variable type declaration>``. Default | |
| implicit rule is given by | |
| :: | |
| implicit real (a-h,o-z,$_), integer (i-m) | |
| + ``entry`` statements | |
| :: | |
| entry <entry name> [()] | |
| F2PY generates wrappers to all entry names using the signature | |
| of the routine block. | |
| Tip: ``entry`` statement can be used to describe the signature | |
| of an arbitrary routine allowing F2PY to generate a number of | |
| wrappers from only one routine block signature. There are few | |
| restrictions while doing this: ``fortranname`` cannot be used, | |
| ``callstatement`` and ``callprotoargument`` can be used only if | |
| they are valid for all entry routines, etc. | |
| In addition, F2PY introduces the following statements: | |
| + ``threadsafe`` | |
| Use ``Py_BEGIN_ALLOW_THREADS .. Py_END_ALLOW_THREADS`` block | |
| around the call to Fortran/C function. | |
| + ``callstatement <C-expr|multi-line block>`` | |
| Replace F2PY generated call statement to Fortran/C function with | |
| ``<C-expr|multi-line block>``. The wrapped Fortran/C function | |
| is available as ``(*f2py_func)``. To raise an exception, set | |
| ``f2py_success = 0`` in ``<C-expr|multi-line block>``. | |
| + ``callprotoargument <C-typespecs>`` | |
| When ``callstatement`` statement is used then F2PY may not | |
| generate proper prototypes for Fortran/C functions (because | |
| ``<C-expr>`` may contain any function calls and F2PY has no way | |
| to determine what should be the proper prototype). With this | |
| statement you can explicitly specify the arguments of the | |
| corresponding prototype:: | |
| extern <return type> FUNC_F(<routine name>,<ROUTINE NAME>)(<callprotoargument>); | |
| + ``fortranname [<actual Fortran/C routine name>]`` | |
| You can use arbitrary ``<routine name>`` for a given Fortran/C | |
| function. Then you have to specify | |
| ``<actual Fortran/C routine name>`` with this statement. | |
| If ``fortranname`` statement is used without | |
| ``<actual Fortran/C routine name>`` then a dummy wrapper is | |
| generated. | |
| + ``usercode <multi-line block>`` | |
| When used inside ``python module`` block, then given C code | |
| will be inserted to generated C/API source just before | |
| wrapper function definitions. Here you can define arbitrary | |
| C functions to be used in initialization of optional arguments, | |
| for example. If ``usercode`` is used twice inside ``python | |
| module`` block then the second multiline block is inserted | |
| after the definition of external routines. | |
| When used inside ``<routine singature>``, then given C code will | |
| be inserted to the corresponding wrapper function just after | |
| declaring variables but before any C statements. So, ``usercode`` | |
| follow-up can contain both declarations and C statements. | |
| When used inside the first ``interface`` block, then given C | |
| code will be inserted at the end of the initialization | |
| function of the extension module. Here you can modify extension | |
| modules dictionary. For example, for defining additional | |
| variables etc. | |
| + ``pymethoddef <multiline block>`` | |
| Multiline block will be inserted to the definition of | |
| module methods ``PyMethodDef``-array. It must be a | |
| comma-separated list of C arrays (see `Extending and Embedding`__ | |
| Python documentation for details). | |
| ``pymethoddef`` statement can be used only inside | |
| ``python module`` block. | |
| __ http://www.python.org/doc/current/ext/ext.html | |
| Attributes | |
| ------------ | |
| The following attributes are used by F2PY: | |
| ``optional`` | |
| The corresponding argument is moved to the end of ``<optional | |
| arguments>`` list. A default value for an optional argument can be | |
| specified ``<init_expr>``, see ``entitydecl`` definition. Note that | |
| the default value must be given as a valid C expression. | |
| Note that whenever ``<init_expr>`` is used, ``optional`` attribute | |
| is set automatically by F2PY. | |
| For an optional array argument, all its dimensions must be bounded. | |
| ``required`` | |
| The corresponding argument is considered as a required one. This is | |
| default. You need to specify ``required`` only if there is a need to | |
| disable automatic ``optional`` setting when ``<init_expr>`` is used. | |
| If Python ``None`` object is used as an required argument, the | |
| argument is treated as optional. That is, in the case of array | |
| argument, the memory is allocated. And if ``<init_expr>`` is given, | |
| the corresponding initialization is carried out. | |
| ``dimension(<arrayspec>)`` | |
| The corresponding variable is considered as an array with given | |
| dimensions in ``<arrayspec>``. | |
| ``intent(<intentspec>)`` | |
| This specifies the "intention" of the corresponding | |
| argument. ``<intentspec>`` is a comma separated list of the | |
| following keys: | |
| + ``in`` | |
| The argument is considered as an input-only argument. It means | |
| that the value of the argument is passed to Fortran/C function and | |
| that function is expected not to change the value of an argument. | |
| + ``inout`` | |
| The argument is considered as an input/output or *in situ* | |
| output argument. ``intent(inout)`` arguments can be only | |
| "contiguous" Numpy arrays with proper type and size. Here | |
| "contiguous" can be either in Fortran or C sense. The latter one | |
| coincides with the contiguous concept used in Numpy and is | |
| effective only if ``intent(c)`` is used. Fortran contiguity | |
| is assumed by default. | |
| Using ``intent(inout)`` is generally not recommended, use | |
| ``intent(in,out)`` instead. See also ``intent(inplace)`` attribute. | |
| + ``inplace`` | |
| The argument is considered as an input/output or *in situ* | |
| output argument. ``intent(inplace)`` arguments must be | |
| Numpy arrays with proper size. If the type of an array is | |
| not "proper" or the array is non-contiguous then the array | |
| will be changed in-place to fix the type and make it contiguous. | |
| Using ``intent(inplace)`` is generally not recommended either. | |
| For example, when slices have been taken from an | |
| ``intent(inplace)`` argument then after in-place changes, | |
| slices data pointers may point to unallocated memory area. | |
| + ``out`` | |
| The argument is considered as an return variable. It is appended | |
| to the ``<returned variables>`` list. Using ``intent(out)`` | |
| sets ``intent(hide)`` automatically, unless also | |
| ``intent(in)`` or ``intent(inout)`` were used. | |
| By default, returned multidimensional arrays are | |
| Fortran-contiguous. If ``intent(c)`` is used, then returned | |
| multidimensional arrays are C-contiguous. | |
| + ``hide`` | |
| The argument is removed from the list of required or optional | |
| arguments. Typically ``intent(hide)`` is used with ``intent(out)`` | |
| or when ``<init_expr>`` completely determines the value of the | |
| argument like in the following example:: | |
| integer intent(hide),depend(a) :: n = len(a) | |
| real intent(in),dimension(n) :: a | |
| + ``c`` | |
| The argument is treated as a C scalar or C array argument. In | |
| the case of a scalar argument, its value is passed to C function | |
| as a C scalar argument (recall that Fortran scalar arguments are | |
| actually C pointer arguments). In the case of an array | |
| argument, the wrapper function is assumed to treat | |
| multidimensional arrays as C-contiguous arrays. | |
| There is no need to use ``intent(c)`` for one-dimensional | |
| arrays, no matter if the wrapped function is either a Fortran or | |
| a C function. This is because the concepts of Fortran- and | |
| C contiguity overlap in one-dimensional cases. | |
| If ``intent(c)`` is used as an statement but without entity | |
| declaration list, then F2PY adds ``intent(c)`` attibute to all | |
| arguments. | |
| Also, when wrapping C functions, one must use ``intent(c)`` | |
| attribute for ``<routine name>`` in order to disable Fortran | |
| specific ``F_FUNC(..,..)`` macros. | |
| + ``cache`` | |
| The argument is treated as a junk of memory. No Fortran nor C | |
| contiguity checks are carried out. Using ``intent(cache)`` | |
| makes sense only for array arguments, also in connection with | |
| ``intent(hide)`` or ``optional`` attributes. | |
| + ``copy`` | |
| Ensure that the original contents of ``intent(in)`` argument is | |
| preserved. Typically used in connection with ``intent(in,out)`` | |
| attribute. F2PY creates an optional argument | |
| ``overwrite_<argument name>`` with the default value ``0``. | |
| + ``overwrite`` | |
| The original contents of the ``intent(in)`` argument may be | |
| altered by the Fortran/C function. F2PY creates an optional | |
| argument ``overwrite_<argument name>`` with the default value | |
| ``1``. | |
| + ``out=<new name>`` | |
| Replace the return name with ``<new name>`` in the ``__doc__`` | |
| string of a wrapper function. | |
| + ``callback`` | |
| Construct an external function suitable for calling Python function | |
| from Fortran. ``intent(callback)`` must be specified before the | |
| corresponding ``external`` statement. If 'argument' is not in | |
| argument list then it will be added to Python wrapper but only | |
| initializing external function. | |
| Use ``intent(callback)`` in situations where a Fortran/C code | |
| assumes that a user implements a function with given prototype | |
| and links it to an executable. Don't use ``intent(callback)`` | |
| if function appears in the argument list of a Fortran routine. | |
| With ``intent(hide)`` or ``optional`` attributes specified and | |
| using a wrapper function without specifying the callback argument | |
| in argument list then call-back function is looked in the | |
| namespace of F2PY generated extension module where it can be | |
| set as a module attribute by a user. | |
| + ``aux`` | |
| Define auxiliary C variable in F2PY generated wrapper function. | |
| Useful to save parameter values so that they can be accessed | |
| in initialization expression of other variables. Note that | |
| ``intent(aux)`` silently implies ``intent(c)``. | |
| The following rules apply: | |
| + If no ``intent(in | inout | out | hide)`` is specified, | |
| ``intent(in)`` is assumed. | |
| + ``intent(in,inout)`` is ``intent(in)``. | |
| + ``intent(in,hide)`` or ``intent(inout,hide)`` is | |
| ``intent(hide)``. | |
| + ``intent(out)`` is ``intent(out,hide)`` unless ``intent(in)`` or | |
| ``intent(inout)`` is specified. | |
| + If ``intent(copy)`` or ``intent(overwrite)`` is used, then an | |
| additional optional argument is introduced with a name | |
| ``overwrite_<argument name>`` and a default value 0 or 1, respectively. | |
| + ``intent(inout,inplace)`` is ``intent(inplace)``. | |
| + ``intent(in,inplace)`` is ``intent(inplace)``. | |
| + ``intent(hide)`` disables ``optional`` and ``required``. | |
| ``check([<C-booleanexpr>])`` | |
| Perform consistency check of arguments by evaluating | |
| ``<C-booleanexpr>``; if ``<C-booleanexpr>`` returns 0, an exception | |
| is raised. | |
| If ``check(..)`` is not used then F2PY generates few standard checks | |
| (e.g. in a case of an array argument, check for the proper shape | |
| and size) automatically. Use ``check()`` to disable checks generated | |
| by F2PY. | |
| ``depend([<names>])`` | |
| This declares that the corresponding argument depends on the values | |
| of variables in the list ``<names>``. For example, ``<init_expr>`` | |
| may use the values of other arguments. Using information given by | |
| ``depend(..)`` attributes, F2PY ensures that arguments are | |
| initialized in a proper order. If ``depend(..)`` attribute is not | |
| used then F2PY determines dependence relations automatically. Use | |
| ``depend()`` to disable dependence relations generated by F2PY. | |
| When you edit dependence relations that were initially generated by | |
| F2PY, be careful not to break the dependence relations of other | |
| relevant variables. Another thing to watch out is cyclic | |
| dependencies. F2PY is able to detect cyclic dependencies | |
| when constructing wrappers and it complains if any are found. | |
| ``allocatable`` | |
| The corresponding variable is Fortran 90 allocatable array defined | |
| as Fortran 90 module data. | |
| .. _external: | |
| ``external`` | |
| The corresponding argument is a function provided by user. The | |
| signature of this so-called call-back function can be defined | |
| - in ``__user__`` module block, | |
| - or by demonstrative (or real, if the signature file is a real Fortran | |
| code) call in the ``<other statements>`` block. | |
| For example, F2PY generates from | |
| :: | |
| external cb_sub, cb_fun | |
| integer n | |
| real a(n),r | |
| call cb_sub(a,n) | |
| r = cb_fun(4) | |
| the following call-back signatures:: | |
| subroutine cb_sub(a,n) | |
| real dimension(n) :: a | |
| integer optional,check(len(a)>=n),depend(a) :: n=len(a) | |
| end subroutine cb_sub | |
| function cb_fun(e_4_e) result (r) | |
| integer :: e_4_e | |
| real :: r | |
| end function cb_fun | |
| The corresponding user-provided Python function are then:: | |
| def cb_sub(a,[n]): | |
| ... | |
| return | |
| def cb_fun(e_4_e): | |
| ... | |
| return r | |
| See also ``intent(callback)`` attribute. | |
| ``parameter`` | |
| The corresponding variable is a parameter and it must have a fixed | |
| value. F2PY replaces all parameter occurrences by their | |
| corresponding values. | |
| Extensions | |
| ============ | |
| F2PY directives | |
| ----------------- | |
| The so-called F2PY directives allow using F2PY signature file | |
| constructs also in Fortran 77/90 source codes. With this feature you | |
| can skip (almost) completely intermediate signature file generations | |
| and apply F2PY directly to Fortran source codes. | |
| F2PY directive has the following form:: | |
| <comment char>f2py ... | |
| where allowed comment characters for fixed and free format Fortran | |
| codes are ``cC*!#`` and ``!``, respectively. Everything that follows | |
| ``<comment char>f2py`` is ignored by a compiler but read by F2PY as a | |
| normal Fortran, non-comment line: | |
| When F2PY finds a line with F2PY directive, the directive is first | |
| replaced by 5 spaces and then the line is reread. | |
| For fixed format Fortran codes, ``<comment char>`` must be at the | |
| first column of a file, of course. For free format Fortran codes, | |
| F2PY directives can appear anywhere in a file. | |
| C expressions | |
| -------------- | |
| C expressions are used in the following parts of signature files: | |
| * ``<init_expr>`` of variable initialization; | |
| * ``<C-booleanexpr>`` of the ``check`` attribute; | |
| * ``<arrayspec> of the ``dimension`` attribute; | |
| * ``callstatement`` statement, here also a C multiline block can be used. | |
| A C expression may contain: | |
| * standard C constructs; | |
| * functions from ``math.h`` and ``Python.h``; | |
| * variables from the argument list, presumably initialized before | |
| according to given dependence relations; | |
| * the following CPP macros: | |
| ``rank(<name>)`` | |
| Returns the rank of an array ``<name>``. | |
| ``shape(<name>,<n>)`` | |
| Returns the ``<n>``-th dimension of an array ``<name>``. | |
| ``len(<name>)`` | |
| Returns the lenght of an array ``<name>``. | |
| ``size(<name>)`` | |
| Returns the size of an array ``<name>``. | |
| ``slen(<name>)`` | |
| Returns the length of a string ``<name>``. | |
| For initializing an array ``<array name>``, F2PY generates a loop over | |
| all indices and dimensions that executes the following | |
| pseudo-statement:: | |
| <array name>(_i[0],_i[1],...) = <init_expr>; | |
| where ``_i`` refers to the ``<i>``-th index value and that runs | |
| from ``0`` to ``shape(<array name>,<i>)-1``. | |
| For example, a function ``myrange(n)`` generated from the following | |
| signature | |
| :: | |
| subroutine myrange(a,n) | |
| fortranname ! myrange is a dummy wrapper | |
| integer intent(in) :: n | |
| real*8 intent(c,out),dimension(n),depend(n) :: a = _i[0] | |
| end subroutine myrange | |
| is equivalent to ``numpy.arange(n,dtype=float)``. | |
| .. warning:: | |
| F2PY may lower cases also in C expressions when scanning Fortran codes | |
| (see ``--[no]-lower`` option). | |
| Multiline blocks | |
| ------------------ | |
| A multiline block starts with ``'''`` (triple single-quotes) and ends | |
| with ``'''`` in some *strictly* subsequent line. Multiline blocks can | |
| be used only within .pyf files. The contents of a multiline block can | |
| be arbitrary (except that it cannot contain ``'''``) and no | |
| transformations (e.g. lowering cases) are applied to it. | |
| Currently, multiline blocks can be used in the following constructs: | |
| + as a C expression of the ``callstatement`` statement; | |
| + as a C type specification of the ``callprotoargument`` statement; | |
| + as a C code block of the ``usercode`` statement; | |
| + as a list of C arrays of the ``pymethoddef`` statement; | |
| + as documentation string. | |