2015-10-10 3 views
4

Я пытаюсь сделать функцию, которая будет проверять, существует ли функция или нет, а затем возвращает логическое значение на основе, если оно существует или нет.Попробуйте, за исключением неизвестной функции?

Это мой код; Однако, Python IDLE 3,5 говорит мне, что есть ошибка с моей Eval() заявление, но я не вижу, что это не так:

def testFunction(entity): 
    try eval(entity)(): 
     return True 
    except NameError: 
     return False 

Может кто-то помочь?

ответ

5

Ваше заявление try неверно. Это должно было быть -

def testFunction(entity): 
    try: return callable(eval(entity)) 
    except NameError: 
     return False 

Вам не нужно вызывать функцию либо (для проверки доступны или нет ли его). Вышеупомянутая функция использует встроенную функцию callable, чтобы проверить, является ли функция entity функцией/классом.


Но если вы проверяете для простых функций (а не встроенные функции или функции модуля как module.function) Я бы сказал, что было бы лучше использовать globals() словарь и искать в ней, а не с помощью eval(). Пример -

def testFunction(entity): 
    try: return callable(globals()[entity]) 
    except KeyError: 
     return False 

Пожалуйста, обратите внимание, что выше, не будет возвращать True для встроенных функций или функций, доступ к которым, как - module.function и т.д. Если вам нужно будет проверить для тех, кто, как хорошо, и если вы доверяете источнику откуда вы получите entity, вы можете вернуться к использованию eval.

+0

О, хорошо. Но почему лучше использовать globals() вместо eval()? Разве они не выполняют одно и то же? – Ivy

+0

Поскольку ['eval' является опасным] (http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html) –

Смежные вопросы