Python 常用内置函数详解(四):callable()函数——检测对象是否可被调用

一、语法

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)))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Amo Xiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值