gpt4 book ai didi

python - 最简单的方法来 "store"一个类上的函数而不绑定(bind)它?

转载 作者:太空宇宙 更新时间:2023-11-03 15:03:03 24 4
gpt4 key购买 nike

我正在编写一些支持代码以加快通过 RequestFactory 调用 Django View (在别处声明的函数)。我将大部分测试属性直接存储在类上,而不是它们的实例上。

我必须做的一件事是在类中存储我感兴趣的函数,以便稍后调用它(使用 inspect 为其提供正确的参数)。

这是我的总体意图:

def to_test(var1, var2, var3):
"this function has nothing to do with MyTest"
assert isinstance(var1, basestring), "not an instance"

class MyTest(unittest.TestCase):

#only using this attribute to store the function to
#test, not to bind that function
func_under_test = to_test

def test_with_abc(self):
self.func_under_test("a","b", "c")

def test_with_def(self):
self.func_under_test("d","e", "f")

但是一旦我将一个函数分配给一个类,它就会绑定(bind)到该类。

这在 99% 的时间里都很棒。只是不在这里,因为它在调用时得到了错误的参数。相反,在每个类上我都重新声明某物,以便我可以将函数分配给它,而不是直接在类上。甚至元类也无济于事。

一些示例代码

我想要的是 FunctionStore1/2 的语法。我实际上最接近的是 FunctionStore3/4/6,但它们要求您每次都记住复制和粘贴小的 _ 声明。没什么大不了的,只是 hacky。

def regular_function(*args, **kwds):
print (" regular_function(%s)" % (locals()))

def regular_function2(*args, **kwds):
print (" regular_function2(%s)" % (locals()))

class FunctionStore1(object):
"this fails, expecting an instance"
func_to_check = regular_function

class FunctionStore2(object):
"ditto"
func_to_check = regular_function2

class FunctionStore3Works(object):
"this works"

def _(): pass
_.func_to_check = regular_function


class FunctionStore4Works(object):
"""this too, but I have to redeclare the `_` each time
can I use MetaClass?
"""

def _(): pass
_.func_to_check = regular_function2

class BaseTsupporter(object):
"this doesnt help..."
def _(): pass

class FunctionStore5(BaseTsupporter):
"because there is no `_` here"

try:
_.func_to_check = regular_function
except Exception, e:
print ("\nno `_` on FunctionStore5:e:%s" % (e))

class FunctionStore6Works(object):
"trying a dict"

_ = dict(func_to_check=regular_function)

class MyMeta(type):
def __new__(meta, name, bases, dct):
res = super(MyMeta, meta).__new__(meta, name, bases, dct)
#this works...
res._ = dict()
return res

def __init__(cls, name, bases, dct):
super(MyMeta, cls).__init__(name, bases, dct)

try:
class FunctionStore7Meta(object):
"using meta"

__metaclass__ = MyMeta

try:
_.update(func_to_check=regular_function)
except Exception, e:
print ("\nno `_` dict on FunctionStore7:e:%s" % (e))

except Exception, e:
print ("\nno luck creating FunctionStore7 class :( exception:\n %s" % (e))

#never mind the locals() + globals() hack, that's because this code is actually in a function to
#allow SO's indenting...
li_to_call = [(k,v) for k, v in (locals().items() + globals().items()) if k.startswith("FunctionStore")]
li_to_call.sort()

for name, cls_ in li_to_call:
print ("\n calling %s" % (name))
try:
if getattr(cls_, "func_to_check", None):
cls_.func_to_check(name)
elif hasattr(cls_, "_") and hasattr(cls_._, "func_to_check"):
cls_._.func_to_check(name)
elif hasattr(cls_, "_") and isinstance(cls_._, dict) and cls_._.get("func_to_check"):
cls_._["func_to_check"](name)
else:
print (" %s: no func_to_check" % (name))

if "Meta" in name:
print(" even if %s does have a `_`, now:%s" % (name, cls_._))

except Exception, e:
print (" %s: exception:%s" % (name, e))

输出:

no `_` on FunctionStore5:e:name '_' is not defined

no `_` dict on FunctionStore7:e:name '_' is not defined

calling FunctionStore1
FunctionStore1: exception:unbound method regular_function() must be called with FunctionStore1 instance as first argument (got str instance instead)

calling FunctionStore2
FunctionStore2: exception:unbound method regular_function2() must be called with FunctionStore2 instance as first argument (got str instance instead)

calling FunctionStore3Works
regular_function({'args': ('FunctionStore3Works',), 'kwds': {}})

calling FunctionStore4Works
regular_function2({'args': ('FunctionStore4Works',), 'kwds': {}})

calling FunctionStore5
FunctionStore5: no func_to_check

calling FunctionStore6Works
regular_function({'args': ('FunctionStore6Works',), 'kwds': {}})

calling FunctionStore7Meta
FunctionStore7Meta: no func_to_check
even if FunctionStore7Meta does have a `_`, now:{}

最佳答案

您可以将函数包装在 staticmethod 中:

class FunctionStore1(object):
"this fails, expecting an instance"
func_to_check = staticmethod(regular_function)

关于python - 最简单的方法来 "store"一个类上的函数而不绑定(bind)它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35781190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com