qwertz
qwertz

Reputation: 14792

Python 3: "NameError: name 'function' is not defined"

Running

def foo(bar: function):
    bar()

foo(lambda: print("Greetings from lambda."))

with Python 3.6.2 yields

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'function' is not defined

However, removing the type annotation works as expected.

PyCharm additionally gives the warning 'function' object is not callable on line bar().


edit: As stated in my comment of Pieters’ answer, this question raised, because

def myfunction():
    pass

print(myfunction.__class__)

outputs <class 'function'>.

Upvotes: 9

Views: 11054

Answers (2)

蔡宗容
蔡宗容

Reputation: 1047

Absolute Answer

from types import FunctionType as function

def foo(bar: function):
    bar()

foo(lambda: print("Greetings from lambda."))

print('-' * 30)
print(function)
print('type(foo) is function:', type(foo) is function)
print('type(foo) == function:', type(foo) == function)
print('function is foo.__class__:', function is foo.__class__)
print('function == foo.__class__:', function == foo.__class__)
print('callable(foo):', callable(foo))

Execution result: enter image description here

Upvotes: 4

Martijn Pieters
Martijn Pieters

Reputation: 1121266

There is no name function defined in Python, no. Annotations are still Python expressions and must reference valid names.

You can instead use type hinting to say bar is a callable; use typing.Callable:

from typing import Any, Callable

def foo(bar: Callable[[], Any]):
    bar()

This defines a callable type that takes no arguments and whose return value can be anything (we don't care).

Upvotes: 18

Related Questions