一、语法
callable 函数的语法格式如下:
In [1]: callable?
Signature: callable(obj, /)
Docstring:
Return whether the object is callable (i.e., some kind of function).
Note that classes are callable, as are instances of classes with a
__call__() method.
Type: builtin_function_or_method
参数说明:
1.object: 对象
2.返回值: 如果对象可调用返回 True,否则返回 False
3.说明: 对于函数、方法、lambda 函式、类以及实现了__call__方法的类实例, 它都返回 True。
二、示例
【示例1】判断常用数据类型和内置函数是否可以被调用。
str_val = 'amo'
tuple_val = (1, 2, 3, 4, 5)
list_val = [1, 2, 3, 4, 5]
dict_val = {'name': 'paul'}
print(callable(str_val)) # 结果为False
print(callable(tuple_val)) # 结果为False
print(callable(list_val)) # 结果为False
print(callable(dict_val)) # 结果为False
print(callable(str_val.capitalize)) # 结果为True
print(callable(tuple_val.count)) # 结果为True
print(callable(list_val.reverse)) # 结果为True
print(callable(dict_val.values)) # 结果为True
【示例2】判断函数、lambda 表达式和方法是否可以被调用。
def add(x):
return x + 1
l = lambda x: x + 1
class A:
name = 'Andy'
def test(self):
return 'test'
print(callable(add)) # 结果为True
print(callable(l)) # 结果为True
print(callable(A.test)) # 结果为True
print(callable(A.name)) # 结果为False
【示例3】判断类和实例是否可以被调用。
class A:
def test(self):
return 'test'
a = A() # 实例化类A
print(callable(A)) # 判断类是否可以被调用
print(callable(a)) # 判断实例是否可以被调用
【示例4】设置 __call__()
方法使实例可以被调用。
class A:
def test(self):
return 'test'
class B:
def __call__(self):
return '函数被调用'
def test(self):
return 'test'
a = A() # 实例化类A
b = B() # 实例化类B
print(callable(a)) # 判断实例对象是否可以被调用 False
print(callable(b)) # 判断实例对象是否可以被调用 True
print(b()) # 调用实例对象 函数被调用
【示例5】处理多种数据类型的参数。
import uuid
from base64 import b64encode
def _tag(value):
if isinstance(value, tuple): # value是元组的情况
return {' t': [_tag(x) for x in value]}
elif isinstance(value, uuid.UUID): # value是UUID的情况
return {' u': value.hex}
elif isinstance(value, bytes): # value是bytes的情况
return {' b': b64encode(value).decode('ascii')}
elif callable(getattr(value, '__html__', None)): # value包含__html__属性的情况
return {' m': value.__html__()}
elif isinstance(value, list): # value是列表的情况
return [_tag(x) for x in value]
elif isinstance(value, dict): # value是字典的情况
iter_items = lambda d: d.iteritems()
return dict((k, _tag(v)) for k, v in iter_items(value))
elif isinstance(value, str): # value是字符串的情况
try:
return value
except UnicodeError:
raise UnicodeError
return value
class HtmlConten:
def __html__(self):
return '<strong>Nice</strong>'
html_content = HtmlConten() # 实例化HtmlContent类
# 不同类型的参数数据
val_list = [
(1, 2, 3),
[1, 2, 3],
'amo',
html_content
]
# 变量参数
for val in val_list:
print('{}作为_tag()函数的参数: {}'.format(val, _tag(val)))