Python check if function exists without running it
Asked Answered
L

8

51

In python how do you check if a function exists without actually running the function (i.e. using try)? I would be testing if it exists in a module.

Laddy answered 4/1, 2014 at 21:21 Comment(1)
Depend on the context, if is a class, if is global defined, you-ll have to extend the question to provide more elements.Nutshell
S
52

You can use dir to check if a name is in a module:

>>> import os
>>> "walk" in dir(os)
True
>>>

In the sample code above, we test for the os.walk function.

Sokotra answered 4/1, 2014 at 21:28 Comment(3)
And then to see if it's actually a function, callable(getattr(os,'walk'))Kliment
What if I want to know if it exists at a global namespace (or from existing imports)?Ephrayim
Use callable(getattr(os,'walk', None)) if you don't want to throw an exceptionAntependium
D
31

You suggested try except. You could indeed use that:

try:
    variable
except NameError:
    print("Not in scope!")
else:
    print("In scope!")

This checks if variable is in scope (it doesn't call the function).

Diatomite answered 4/1, 2014 at 22:8 Comment(3)
They specifically said without running the function and gave try as an example of what they don't want to do.Statue
@Statue This doesn't call the function - that would require variable(). It just checks if variable is defined.Diatomite
Oh I didn't realise you could do that. I don't seem to be able to remove the downvote unless you edit your answer. Can you change something minor so I can remove it?Statue
C
17
Solution1:
import inspect
if (hasattr(m, 'f') and inspect.isfunction(m.f))

Solution2:
import inspect
if ('f' in dir(m) and inspect.isfunction(m.f))

where:
m = module name
f = function defined in m

Claudineclaudio answered 5/1, 2014 at 22:38 Comment(0)
H
5

If you are checking if function exists in a package:

import pkg

print("method" in dir(pkg))

If you are checking if function exists in your script / namespace:

def hello():
    print("hello")

print("hello" in dir())
Houseyhousey answered 9/11, 2018 at 23:57 Comment(0)
T
3

if you are looking for a function in your code, use global()

if "function" in globals():
  ...
Toxemia answered 6/7, 2021 at 9:49 Comment(0)
T
0

If you are looking for the function in class, you can use a "__dict__" option. E.g to check if the function "some_function" in "some_class" do:

if "some_function" in list(some_class.__dict__.keys()):
    print('Function {} found'.format ("some_function"))
Thee answered 16/3, 2020 at 12:12 Comment(1)
You should just use hasattr(some_class, "some_function") for more clarity and because sometimes dict is not used, although this still does not check whether you’re dealing with a function or not.Bechuanaland
R
0

Just wanted to add my solution here. It's 8 years late, and similar variant been suggested, but here is more capable version. Just for those, who find this as i did.

def check(fn):
    def c():pass
    for item in globals().keys():
        if type(globals()[item]) == type(c) and fn == item:
            return print(item, "is Function!")
        elif fn == item:
            return print(fn, "is", type(globals()[item]))
    return print("Can't find", fn)
Rea answered 3/9, 2022 at 20:38 Comment(0)
A
0

I believe this work also and look simpler for me:

def newFunc():
    print("hello")

if newFunc:
    print("newFunc function is exist")
else:
    print("newFunc function is not exist")
Asymptotic answered 30/12, 2023 at 7:37 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.