将数据描述符传递给函数

时间:2019-01-14 10:48:27

标签: python python-3.x

我想将数据描述符对象传递给函数。而是传递__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循环置于其自己的函数中会生成“ even!even!even!even!...”或“ odd!奇数!奇数!奇数!...”:

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()接受我的数据描述符对象以及常规字符串。

1 个答案:

答案 0 :(得分:0)

使用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

感谢您的帮助!