禁用python内置函数
如何禁用python内置函数 例如,我注意到可以重新分配或覆盖禁用python内置函数,python,python-3.x,Python,Python 3.x,如何禁用python内置函数 例如,我注意到可以重新分配或覆盖len()(如len=None),但无法重新分配列表 TypeError:无法设置内置/扩展类型“list”的属性 然而,即使重新分配是可能的,似乎也是如此。在本例中,del len或来自内置导入len的将恢复len()的原始功能 我问这个问题的原因是,有时人们希望设置一个编码挑战,让用户完成,同时禁止使用某些内置函数。一个简单的例子可能是在不使用length函数的情况下确定列表的长度 经过深思熟虑,感谢我已经收到的评论,我现在意识到
len()
(如len=None
),但无法重新分配列表
TypeError:无法设置内置/扩展类型“list”的属性
然而,即使重新分配是可能的,似乎也是如此。在本例中,del len
或来自内置导入len的将恢复len()
的原始功能
我问这个问题的原因是,有时人们希望设置一个编码挑战,让用户完成,同时禁止使用某些内置函数。一个简单的例子可能是在不使用length函数的情况下确定列表的长度
经过深思熟虑,感谢我已经收到的评论,我现在意识到一个完整的证明解决方案是非常困难的,但我仍然对一个在这种情况下可能有用的实用解决方案感兴趣
谢谢前言:
鉴于各种评论对话。。。应该注意的是,这些都不足以保护运行不受信任的代码,为了绝对安全,您需要一个专门内置沙盒的不同解释器。先前的回答是否讨论了这一点
给出了一个编写代码战争问题的例子。。我将使用禁用\uuu len\uuu
函数的自定义类来创建子类list、string等,然后使用您自己的自定义类重写相应的构造函数。。确保将测试用例输入作为新类的实例提供,因为不能重写文本字符串/列表构造函数,因为它们直接链接到解释器
例如:
oldList = list
class myList(list):
def __len__(self):
raise AttributeError("'len' has been disabled for list objects")
list = myList
全局名称\uuuu len\uuuu
和名为\uuuuu len\uuuu
的对象属性是两个完全不同的东西。\uuuuuu len\uuu
是列表
类型的属性,而您的示例为全局命名空间分配了一个新变量。正确的名称空间应该是list.\uuu len\uuu=None
,但是用C实现的类型很难做到这一点。如果您想覆盖对象属性\uuu len\uu
,您必须为每个object@DeepSpace:试试看;你会发现这不管用。你可以试试。我的anaconda装置没什么好运气,但它看起来很有希望。投反对票只是为了好玩,还是有人要解释为什么这是解决Chris问题的糟糕方法?我想他们给你投反对票的原因和我在编辑我的问题之前给你投反对票的原因一样,原因是:OP询问如何替换,但是如何删除\uuu len\uu
@padraickunningham,就像我已经说过的那样。。。您不能重写文本构造函数,但是如果这是为了代码战,您只需向回答问题的人提供一个自定义类的实例作为输入。它们不能为函数体中的每个可能输入值提供文本构造函数。此外,通过这种方法,用户可以dellist
重新获得对原始值的访问。作为一种解决方法,您可以指定\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu.list=myList
mentioned@Aaron显然,除非您编写一个实现所请求行为的完整功能的CPython变体,否则他们不会高兴:P