Next: Operation Specific Type Inference, Previous: Local Function Type Inference, Up: Type Inference [Contents][Index]
As described in section function-types, a global function type
(ftype
) declaration places implicit type assertions on the
call arguments, and also guarantees the type of the return value. So
wherever a call to a declared function appears, there is no doubt as
to the types of the arguments and return value. Furthermore,
Python will infer a function type from the function’s definition if
there is no ftype
declaration. Any type declarations on the
argument variables are used as the argument types in the derived
function type, and the compiler’s best guess for the result type of
the function is used as the result type in the derived function type.
This method of deriving function types from the definition implicitly assumes that functions won’t be redefined at run-time. Consider this example:
(defun foo-p (x) (let ((res (and (consp x) (eq (car x) 'foo)))) (format t "It is ~:[not ~;~]foo." res))) (defun frob (it) (if (foo-p it) (setf (cadr it) 'yow!) (1+ it)))
Presumably, the programmer really meant to return res
from
foo-p
, but he seems to have forgotten. When he tries to call
do (frob (list 'foo nil))
, frob
will flame out when
it tries to add to a cons
. Realizing his error, he fixes
foo-p
and recompiles it. But when he retries his test case, he
is baffled because the error is still there. What happened in this
example is that Python proved that the result of foo-p
is
null
, and then proceeded to optimize away the setf
in
frob
.
Fortunately, in this example, the error is detected at compile time due to notes about unreachable code (see dead-code-notes.) Still, some users may not want to worry about this sort of problem during incremental development, so there is a variable to control deriving function types.
If true (the default), argument and result type information derived
from compilation of defun
s is used when compiling calls to
that function. If false, only information from ftype
proclamations will be used.
Next: Operation Specific Type Inference, Previous: Local Function Type Inference, Up: Type Inference [Contents][Index]