Как определить, является ли переменная Python функцией?

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

Вот как я могу это сделать:

import, os, csv # and other imports you need
nicknames_to_delete = ['Nick', 'Stephen', 'Mark']

Я предполагаю, что nicknames.csv содержит такие данные, как:

Nick
Maria
James
Chris
Mario
Stephen
Isabella
Ahmed
Julia
Mark
...

Затем загрузите файл в список:

 nicknames = None
 with open("nicknames.csv") as sourceFile:
     nicknames = sourceFile.read().splitlines()

Затем перейдите к списку, чтобы он соответствовал вашим входам delete:

for nick in nicknames_to_delete:
     try:
         if nick in nicknames:
             nicknames.pop(nicknames.index(nick))
         else:
             print(nick + " is not found in the file")
     except ValueError:
         pass

Наконец, верните результат в файл:

with open("nicknames.csv", "a") as nicknamesFile:
    nicknamesFile.seek(0)
    nicknamesFile.truncate()
    nicknamesWriter = csv.writer(nicknamesFile)
    for name in nicknames:
        nicknamesWriter.writeRow([str(name)])
nicknamesFile.close()
587
задан Peter Mortensen 24 February 2018 в 11:38
поделиться

7 ответов

Если это для Python 2.x или для Python 3.2 +, можно также использовать callable(). Это раньше удерживалось от использования, но теперь неустаревше, таким образом, можно использовать его снова. Можно считать обсуждение здесь: http://bugs.python.org/issue10518 . Можно сделать это с:

callable(obj)

, Если это для Python 3.x, но прежде 3.2, проверьте, имеет ли объект __call__ атрибут. Можно сделать это с:

hasattr(obj, '__call__')

часто предложенный types.FunctionTypes подход не корректен, потому что ему не удается покрыть много случаев, как которые Вы, по-видимому, хотели бы, чтобы он передал, с builtins:

>>> isinstance(open, types.FunctionType)
False

>>> callable(open)
True

надлежащий способ проверить свойства утиных типизированных объектов состоит в том, чтобы спросить их, если они шарлатан, чтобы не видеть, помещаются ли они в контейнер размера утки. Не используйте types.FunctionType, если у Вас нет очень определенной идеи того, какова функция.

791
ответ дан John Feminella 24 February 2018 в 21:38
поделиться
  • 1
    В v2 there' s некоторая поддержка локаута учетной записи из-за скота, вызывающего пароль. – Brock Allen 31 March 2014 в 13:49

Функция является просто классом с __call__ метод, таким образом, можно сделать

hasattr(obj, '__call__')

, Например:

>>> hasattr(x, '__call__')
True

>>> x = 2
>>> hasattr(x, '__call__')
False

, Который является "лучшим" способом сделать его, но в зависимости от того, почему необходимо знать, если это является вызываемым или отмечает, Вы могли бы просто поместить его в try/execpt блок:

try:
    x()
except TypeError:
    print "was not callable"

спорно, является ли попыткой/кроме больше Python'y, чем выполнение if hasattr(x, '__call__'): x().. Я сказал бы hasattr, более точно, начиная с Вас, привычка случайно ловит неправильный TypeError, например:

>>> def x():
...     raise TypeError
... 
>>> hasattr(x, '__call__')
True # Correct
>>> try:
...     x()
... except TypeError:
...     print "x was not callable"
... 
x was not callable # Wrong!
5
ответ дан dbr 24 February 2018 в 21:38
поделиться
  • 1
    Я сравнил бы " make" и " gcc" с " git" и " ftp-transfer" в сетевой технологии.: мерзавец похож, делают (только обновление измененных файлов, если Вы хотите, который является случаем общего использования), и gcc как ftp (изменяющий все) – Timo 15 June 2014 в 20:07

Попытайтесь использовать callable(x).

5
ответ дан maxyfc 24 February 2018 в 21:38
поделиться

callable(x) будет возвращать true, если объект передал, может быть назван в Python, но функция не существует в Python 3.0, и правильно разговор не будет различать:

class A(object):
    def __call__(self):
        return 'Foo'

def B():
    return 'Bar'

a = A()
b = B

print type(a), callable(a)
print type(b), callable(b)

Вы доберетесь <class 'A'> True и <type function> True, как произведено.

isinstance работы отлично, чтобы определить, является ли что-то функцией (попытка isinstance(b, types.FunctionType)); если Вы действительно интересуетесь знанием, если что-то можно назвать, можно или использовать hasattr(b, '__call__') или просто попробовать его.

test_as_func = True
try:
    b()
except TypeError:
    test_as_func = False
except:
    pass

Это, конечно, не скажет Вам, является ли это вызываемым, но бросает TypeError, когда это выполняется или не является вызываемым во-первых. Это не может иметь значения для Вас.

19
ответ дан Chris B. 24 February 2018 в 21:38
поделиться

Следующее должно возвратить булевскую переменную:

callable(x)
34
ответ дан Nikhil Chelliah 24 February 2018 в 21:38
поделиться

Встроенные типы, которые не имеют конструкторов во встроенном пространстве имен (например, функции, генераторы, методы) находятся в types модуль. Можно использовать types.FunctionType в вызове isinstance.

In [1]: import types
In [2]: types.FunctionType
Out[2]: <type 'function'>
In [3]: def f(): pass
   ...:
In [4]: isinstance(f, types.FunctionType)
Out[4]: True
In [5]: isinstance(lambda x : None, types.FunctionType)
Out[5]: True
246
ответ дан user2357112 24 February 2018 в 21:38
поделиться

Точное Функциональное Средство проверки

вызываемый является очень хорошим решением. Однако я хотел рассматривать это противоположный способ John Feminella. Вместо того, чтобы рассматривать его как это высказывание:

надлежащий способ проверить свойства утиных типизированных объектов состоит в том, чтобы спросить их, если они шарлатан, чтобы не видеть, помещаются ли они в контейнер размера утки. "Выдерживают сравнение, это непосредственно" подход даст неправильный ответ для многих функций, как builtins.

Мы будем рассматривать его как это:

надлежащий способ проверить, является ли что-то уткой, не состоит в том, чтобы видеть, может ли он шарлатан, а скорее видеть - ли это действительно утка через несколько фильтров, вместо того, чтобы просто проверить, походит ли он на утку от поверхности.

, Как Мы Реализовали бы Его

, модуль 'типов' имеет много классов для обнаружения функций, самое полезное существо типы. FunctionType, но существует также много других, как тип метода, созданный в типе и типе лямбды. Мы также рассмотрим объект 'functools.partial', как являющийся функцией.

простой способ, которым мы проверяем, является ли это функция, при помощи isinstance условия на всех этих типах. Ранее, я хотел сделать базовый класс, который наследовался всему вышеупомянутому, но я не могу сделать это, поскольку Python не позволяет нам наследоваться некоторым вышеупомянутым классам.

Вот таблица того, что классы могут классифицировать что функции:

Functions table from kinght-金 Выше функциональной таблицы kinght-й ‡ ‘

Код, Который Делает Это

Теперь, это - код, который делает всю работу, которую мы описали сверху.

from types import BuiltinFunctionType, BuiltinMethodType,  FunctionType, MethodType, LambdaType
from functools import partial

def is_function(obj):
  return isinstance(obj, (BuiltinFunctionType, BuiltinMethodType,  FunctionType, MethodType, LambdaType, partial))

#-------------------------------------------------

def my_func():
  pass

def add_both(x, y):
  return x + y

class a:
  def b(self):
    pass

check = [

is_function(lambda x: x + x),
is_function(my_func),
is_function(a.b),
is_function(partial),
is_function(partial(add_both, 2))

]

print(check)
>>> [True, True, True, False, True]

одна ложь была (неравнодушным) is_function, потому что это - класс, не функция, и это - точно функции, не классы. Вот предварительный просмотр , чтобы Вы испытали код от.

Заключение

, вызываемое (obj) , является предпочтительным методом проверить, является ли объект функцией, если Вы хотите пойти ввод утки более чем абсолютные понятия .

Наше пользовательское is_function (obj) , возможно, с некоторыми редактированиями является предпочтительным методом проверить, является ли объект функцией, если Вы не проводите никакого подсчета вызываемый экземпляр класса как функция, но только функции, определяемые встроенный , или с лямбда , определение , или неравнодушный .

И я думаю, что это оборачивает все это.Хорошего дня!

2
ответ дан 22 November 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: