【问题标题】:Disable python in-built function禁用python内置功能
【发布时间】:2016-09-06 18:28:54
【问题描述】:

如何禁用 python 内置函数?

例如,我注意到可以重新分配或覆盖len()(如len = None),但不能重新分配list.__len__(),这会引发:

TypeError: can't set attributes of built-in/extension type 'list'

但是,即使可以重新分配,似乎 easy to override。在此示例中,del lenfrom builtins import len 将恢复 len() 的原始功能。

我问的原因是,在Codewars 上,有时人们希望设置一个让用户完成的编码挑战,同时禁止使用某些内置功能。一个简单的例子可能是在不使用 length 函数的情况下确定列表的长度。

回想起来,感谢我已经收到的 cmets 和 this related question,我现在意识到完全证明的解决方案非常困难,但我仍然对在这种情况下可能有用的实用解决方案感兴趣.

谢谢

【问题讨论】:

  • 全局名称__len__ 和对象的属性__len__ 是两个完全不同的东西。
  • __len__list 类型的属性,而您的示例将一个新变量分配给全局命名空间。正确的命名空间应该是list.__len__ = None,但是你不能用 C 实现的类型轻松地做到这一点。
  • 如果您想覆盖对象属性__len__,您必须对每个对象都这样做
  • @DeepSpace:试试看;你会发现那行不通。
  • 你可以试试forbiddenfruit。我在安装 anaconda 时运气不佳,但看起来很有希望。

标签: python python-3.x


【解决方案1】:

前言: 鉴于各种评论对话......应该注意的是,这些东西都不足以保护运行不受信任的代码,并且为了绝对安全,您需要一个具有专门内置沙盒的不同解释器。Here 是以前的回答讨论这个问题

以编写代码战问题为例。我将使用禁用__len__ 函数的自定义类对列表、字符串等进行子类化,然后使用您自己的自定义类覆盖相应的构造函数。确保将测试用例输入作为新类的实例提供,因为您不能覆盖文字字符串/列表构造函数,因为它们直接链接到解释器..

例如:

oldList = list
class myList(list):
    def __len__(self):
        raise AttributeError("'len' has been disabled for list objects")
list = myList

【讨论】:

  • 只是为了好玩才投了反对票,或者有人会解释为什么这是解决 Chris 问题的坏方法吗?
  • 我认为他们给你投反对票的原因与我在编辑我的问题之前的相同原因,原因是:OP 询问的不是如何替换,而是如何删除 __len__
  • @PadraicCunningham 就像我已经说过的......你不能覆盖文字构造函数,但如果这是为了代码大战,你只需为回答问题的人提供自定义类的实例作为输入.他们不能为函数体内的每个可能的输入值提供文字构造函数..
  • 此外,通过这种方法,用户可以del list 重新获得对原始文件的访问权限。作为一种解决方法,您可以分配__builtins__.list = myList,但这仍然不能解决@PadraicCunningham 提到的问题
  • @Aaron 很明显,除非您编写一个功能齐全的 CPython 变体来实现所请求的行为,否则他们不会高兴:P
猜你喜欢
  • 2015-03-16
  • 2023-03-22
  • 2012-02-29
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
相关资源
最近更新 更多