Python 字符串比较函数()

0 投票
2 回答
1486 浏览
提问于 2025-04-17 23:59

我在网上找到了一段Python代码(http://www.exploit-db.com/exploits/18305/),现在对其中一段代码感到困惑。

老实说,我不太懂Python,但我在其他编程语言上有一些经验。

这个叫做 _computeCollisionChars 的方法会生成一些字符,然后如果这些字符是不同的,就把它们添加到一个字典里。下面是这个方法的定义和与问题相关的部分。注意:具体的代码可以在链接的源代码中找到。

def _computeCollisionChars(self, function, count, charrange):
    baseStr = ""
    baseHash = function(baseStr) # What is this?

    for item in source:
        tempStr = ""

        if tempStr == baseStr:
            continue
        if function(tempStr) == baseHash: # What type of comparison is this?
            # logic goes here...

    return

我有几个问题:

  1. 方法定义中的 function 参数是什么意思?
  2. 最重要的是 function(string) 是干什么的?为什么要进行两次检查,function(tempStr) 会产生什么样的输出呢?

非常感谢大家!

2 个回答

1

在Python中,函数被视为一等公民,这意味着你可以把函数当作参数传递给其他函数。这就是为什么function(baseStr)是在调用传递给_computeCollisionChars的函数对象。

需要注意的是,Python并不会检查传递的参数是否真的是一个函数对象,它只是默认这样做。如果传递的不是函数,程序就会崩溃,并抛出一个TypeError异常。

>>> def f1():
        print "Hello world"

>>> def f2(function):
        function()

>>> f2(f1)
Hello World

>>> f2("not a callable function")
TypeError: 'str' object is not callable
3

看起来你可以把任何可以调用的对象当作 function 传给 _computeCollisionChars。然后,baseHash 会被初始化为用空字符串作为参数调用 function 的结果。在循环里面,有个条件是:如果用空字符串作为参数调用 function 的结果等于 baseHash,就执行某些操作。这有点没意义,因为 tempStr 总是 '',而 baseHash 也不会改变(或者你没有发那部分代码)。

在当前的代码片段中,第二个 if 永远不会被执行,因为 tempStr == baseStr == '' 总是成立。

正如评论者指出的,在实际代码中,tempStrbaseStr 确实会变化,并且 function 预计是一个哈希函数(但任何接受字符串作为参数的函数都应该可以用)。

撰写回答