有没有办法在不传递参数的情况下调用函数?

时间:2017-07-29 22:28:39

标签: python function security

我是信息安全新手,我试图教我自己如何使用python构建一个简单的键盘记录器,我在一个站点中找到了这段代码:

import pythoncom, pyHook

def OnKeyboardEvent(event):
    print 'MessageName:',event.MessageName
    print 'Message:',event.Message
    print 'Time:',event.Time
    print 'Window:',event.Window
    print 'WindowName:',event.WindowName
    print 'Ascii:', event.Ascii, chr(event.Ascii)
    print 'Key:', event.Key
    print 'KeyID:', event.KeyID
    print 'ScanCode:', event.ScanCode
    print 'Extended:', event.Extended
    print 'Injected:', event.Injected
    print 'Alt', event.Alt
    print 'Transition', event.Transition
    print '---'

    # return True to pass the event to other handlers
    return True

# create a hook manager
hm = pyHook.HookManager()
# watch for all mouse events
hm.KeyDown = OnKeyboardEvent
# set the hook
hm.HookKeyboard()
# wait forever
pythoncom.PumpMessages()

当我试图理解这段代码时,我找到了函数' OnKeyboardEvent'没有给出它的参数

hm.KeyDown = OnKeyboardEvent

所以我的问题是: 有没有办法在python中调用函数而不给它参数?

3 个答案:

答案 0 :(得分:3)

在python中,函数名相当于存储函数的变量。换句话说:您可以定义一个名为foo的函数,并将其存储/引用到第二个变量bar中:

def foo():
    print("foo!")

bar = foo

bar() # prints: foo!

在您的情况下,您只是定义了函数OnKeyboardEvent(event),并在hm.KeyDown

中保存了对它的引用

只有当您按下键盘键并且在hm内部从事件处理程序调用时才会调用该函数。并且事件处理程序将事件对象传递给函数。

回答有关在没有参数的情况下调用函数的问题。 可以设置所有参数的默认值的函数 e.g:

def foo(bar = "default string"):
    print(bar)

print(foo()) # prints: default string
print(foo("hello world!")) # prints: hello world!

答案 1 :(得分:0)

当您执行hm.KeyDown = OnKeyboardEvent时,您没有调用函数OnKeyboardEvent,您只需将该函数分配给hm.KeyDown。稍后pyHook.HookManager将在任何KeyboardEvent发生时为您调用该方法。

答案 2 :(得分:0)

调用函数:

OnKeyboardEvent()

指定一个函数让我们说一个变量(这不会立即调用该函数):

var = OnKeyboardEvent

并且您只是将函数OnKeyboardEvent分配给pyHook.HookManager(' s)KeyDown属性

hm = pyHook.HookManager()
hm.KeyDown = OnKeyboardEvent