禁用Python内置函数

4
我该如何禁用Python内置函数?
例如,我注意到可以重新分配或覆盖len()(如len = None),但无法重新分配list.__len __(),这会引发以下错误:

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

然而,即使重新分配是可能的,在覆盖时似乎很容易。在这个例子中,del lenfrom builtins import len将恢复len()的原始功能。
我提出这个问题的原因是,在Codewars上,有时人们想为用户设置编码挑战,同时禁止使用某些内置函数。一个微不足道的例子是在不使用长度函数的情况下确定列表的长度。

经过反思,感谢我已经收到的评论和 这个相关问题,我现在意识到一个完美的解决方案非常困难,但我仍然对一种实用的解决方案感兴趣,它可以在这种情况下有用。

谢谢你


4
全局名称__len__和对象属性__len__是两个完全不同的东西。 - chepner
4
__len__list 类型的一个属性,而你的示例将一个新变量分配给了全局命名空间。正确的命名空间应该是 list.__len__ = None,但是对于在 C 中实现的类型来说,这样做并不容易。 - TigerhawkT3
1
@DeepSpace:试一下,你会发现那行不通。 - user2357112
感谢大家的评论。我注意到 list.__len__ = None 会引发 TypeError 错误,我已经编辑了我的问题以反映这一点。 - Chris_Rands
1
你可以尝试使用forbiddenfruit。我在我的anaconda安装上没有太多运气,但它看起来很有前途。 - Trevor Merrifield
显示剩余8条评论
1个回答

2

前言: 考虑到各种评论交流...应该注意到,这些措施都不足以保护运行不可信代码,为了绝对安全,您需要使用具有专门内置沙盒的不同解释器。这里是以前讨论过的答案。

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

例如:

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

是因为好玩而被踩了一下,还是有人能解释一下为什么这不是解决Chris问题的好方法? - Aaron
我认为他们给你负评是因为我之前编辑我的问题时遇到了相同的原因,原因是:楼主询问的不是如何替换,而是如何删除“__len__”。 - turkus
1
此外,使用这种方法,用户可以通过 del list 来重新访问原始列表。作为解决方法,您可以将 __builtins__.list = myList 分配给它,但这仍然无法解决 @PadraicCunningham 提到的问题。 - Trevor Merrifield
tuple(MyList([1,2,3])).__len__() - Padraic Cunningham
2
@Aaron 显然,除非你编写一个完全功能的 CPython 变体来实现所请求的行为,否则他们不会满意 :P - Two-Bit Alchemist
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接