当前位置: 首页 > 面试题库 >

如何在不明确接受的情况下进入Python方法

蒋鹏鹍
2023-03-14
问题内容

我正在开发一个文档测试框架-基本上是PDF的单元测试。测试是框架定义的类的实例的(修饰)方法,并且在运行时定位并实例化这些实例,并调用这些方法以执行测试。

我的目标是减少将要编写测试的人员所关心的古怪的Python语法,因为这些人可能是也可能不是Python程序员,甚至根本不是很多程序员。因此,我希望他们能够为方法编写“
def foo():”而不是“ def foo(self):”,但仍然能够使用“ self”访问成员。

在一个普通程序中,我会认为这是一个可怕的想法,但是在像这样的领域特定语言的程序中,似乎值得尝试。

通过使用装饰器,我已经成功地从方法签名中消除了self(实际上,由于我已经在测试用例中使用了装饰器,因此我将其放入其中),但是“
self”在引用中并没有引用任何东西。测试案例方法。

我考虑过使用全局自变量,甚至提出一个或多或少有效的实现,但是我宁愿污染最小的命名空间,这就是为什么我更愿意将变量直接注入测试用例方法的本地命名空间。有什么想法吗?


问题答案:

这是一种单行方法修饰器,它似乎无需修改标记为只读的Callable type
*的
任何特殊属性即可完成此工作:

# method decorator -- makes undeclared 'self' argument available to method
injectself = lambda f: lambda self: eval(f.func_code, dict(self=self))

class TestClass:
    def __init__(self, thing):
        self.attr = thing

    @injectself
    def method():
        print 'in TestClass::method(): self.attr = %r' % self.attr
        return 42

test = TestClass("attribute's value")
ret = test.method()
print 'return value:', ret

# output:
# in TestClass::method(): self.attr = "attribute's value"
# return value: 42

需要注意的是,除非你采取预防措施,以防止它,一个副作用的的eval()功能可能是它增加了一些条目-
如在参考__builtin__下键模块__builtins__-自动将dict传递给它。

@kendall:根据您的评论,如何将其与容器类中的方法一起使用(但暂时不考虑其他变量的注入)-以下是您正在做的事情吗?对于我来说,很难理解框架和用户编写的内容之间是如何划分的。对我来说,这听起来像是一个有趣的设计模式。

# method decorator -- makes undeclared 'self' argument available to method
injectself = lambda f: lambda self: eval(f.func_code, dict(self=self))

class methodclass:
    def __call__():
        print 'in methodclass::__call__(): self.attr = %r' % self.attr
        return 42

class TestClass:
    def __init__(self, thing):
        self.attr = thing

    method = injectself(methodclass.__call__)

test = TestClass("attribute's value")
ret = test.method()
print 'return value:', ret

# output
# in methodclass::__call__(): self.attr = "attribute's value"
# return value: 42


 类似资料:
  • 在我的代码中进行一系列计算后,我有了一个,其值为 然后,我需要将这个乘以,我希望计算出的值为

  • 我有一个Android应用程序,在其中我有一个下面的类,其中包含用JNI包装的本机(C++)对象和其他java对象的字段: 在我的应用程序中,我不断地创建MyClass的实例: 当i大于某个数字时,例如当i>400或i>450时,应用程序崩溃。由于我已经像上面的(A)行一样显式地释放了本机内存,所以我认为应该不会有内存泄漏,并且java应该使用垃圾收集来撤销内存。但应用程序崩溃了,我怀疑这可能是内

  • 问题内容: 我正在开发一个网站,用户使用ajax,php和POST方法提交凭据,我想保护登录凭据的格式不是纯文本,但我不想使用SSL我可以在不使用SSL证书的情况下保护密码凭据吗? 谁能给我任何方法的工作示例? 问题答案: 没有一些通道外验证(SSL提供),您将无法完全保护凭据。一个在中间攻击的人永远是可能的。 简而言之,客户端无法完全确定他们正在与服务器通信,而不是在两者之间插入假服务器。

  • 问题内容: 我“d成的运行Django的服务器,我不能简单地和出来。 是否有其他摆脱困境的方法? 目前,我手动关闭本地PC上的选项卡,然后再重新打开,但这变得很烦人。 问题答案: 或 。请参阅屏幕手册#分离。

  • 我想为android清单做一个权限这个权限是 我的问题是,在没有用户干预的情况下,如何做到这一点?

  • 问题内容: 我已经看到了几种通过首先导入来查找模块路径的方法。有没有一种方法,而无需导入模块? 问题答案: 使用pkgutil模块: 使用imp模块: 注意:使用imp模块,您 无法 做类似的事情