首页 > 解决方案 > 将数据描述符传递给函数

问题描述

我想将数据描述符对象传递给函数。相反,__get__()传递的结果。

数据描述符类:(代码是示例代码)

import time

class evenOdd():
    def __get__(self, obj, owner):
        return "even!" if (time.mktime(time.localtime()) % 2 == 0) else "odd!"


class testObject():
    a = evenOdd()

以下代码打印“偶数!奇数!偶数!奇数!...”:

tester = testObject()

for i in range(10):
    print(tester.a, end=" ")
    time.sleep(1)

但是,将 for 循环放在它自己的函数中会生成“偶数!偶数!偶数!偶数!...”或“奇数!奇数!奇数!奇数!...”:

def printer(data):
    for i in range(10):
        print(data, end = " ")
        time.sleep(1)

tester = testObject()
printer(tester.a)

如何将数据描述符对象传递给函数,而不是结果__get__()

编辑:我找到了一种基于 jonrsharpes 响应的解决方法,它可以满足的要求:

def printer(data):
    for i in range(10):
        print(data(), end = " ")
        time.sleep(1)

tester = testObject()
printer(lambda: tester.a)

不幸的是,这意味着printer()不再适用于字符串。如果可能的话,我想printer()接受我的数据描述符对象以及常规字符串。

标签: pythonpython-3.x

解决方案


使用 jonrsharpe 和 L3viathans 响应,我制作了以下代码,它完全符合我的需要:

tester = testObject()

def printer(data):
    isCallable = isinstance(data, collections.abc.Callable)
    for _ in range(10):
        print(data() if isCallable else data, end = " ")
        time.sleep(1)

tester = testObject()
printer(lambda: tester.a)
print("")
printer("test")

这会产生:

odd! even! odd! even! odd! even! odd! even! odd! even!
test test test test test test test test test test

谢谢您的帮助!


推荐阅读