f2py
знает, что a
и n
являются параметрами функции, и из объявления
double precision :: a(n)
он может сделать вывод, что n
является длиной a
. Массивы NumPy имеют длину, поэтому параметр n
в оболочке Python не нужен, а f2py
делает его необязательным.
Обратите внимание, что код, сгенерированный f2py
, проверяет, не указано ли слишком большое значение n
:
In [19]: a = np.zeros(10)
In [20]: fibonacci.fibonacci(a, 99)
---------------------------------------------------------------------------
error Traceback (most recent call last)
<ipython-input-20-e9497469fd10> in <module>()
----> 1 fibonacci.fibonacci(a, 99)
error: (len(a)>=n) failed for 1st keyword n: fibonacci:n=99
Можно указать меньшее значение:
In [21]: a = np.zeros(10)
In [22]: fibonacci.fibonacci(a, 6)
In [23]: a
Out[23]: array([0., 1., 1., 2., 3., 5., 0., 0., 0., 0.])
Возможно, вам будет полезно сгенерировать и просмотреть файл интерфейса, который f2py
создает для этой функции. Команда
f2py -h fibonacci.pyf fibonacci.f
дисплеи
Reading fortran codes...
Reading file 'fibonacci.f' (format:fix,strict)
Post-processing...
Block: fibonacci
Post-processing (stage 2)...
Saving signatures to file "./fibonacci.pyf"
и генерирует файл fibonacci.pyf
, который содержит
! -*- f90 -*-
! Note: the context of this file is case sensitive.
subroutine fibonacci(a,n) ! in fibonacci.f
double precision dimension(n) :: a
integer, optional,check(len(a)>=n),depend(a) :: n=len(a)
end subroutine fibonacci
! This file was auto-generated with f2py (version:2).
! See http://cens.ioc.ee/projects/f2py2e/
Вы можете видеть из сгенерированного объявления
integer, optional,check(len(a)>=n),depend(a) :: n=len(a)
что f2py
сделал вывод, что n
должен быть необязательным параметром, значение которого не должно превышать длину a
и значением по умолчанию является len(a)
.
person
Warren Weckesser
schedule
14.03.2019
implicit none
,::
,enddo
,end subroutine
Сообщение должно быть, забудьте F77 в 21 веке. - person Vladimir F   schedule 14.03.2019