Python 3:将函数传递给 *args
Python 3: Passing functions into *args
我正在使用 _thread
模块(因为它更适合我的程序)并且我想将一个函数传递到我传递给线程的函数中。但是,可以仅将 元组 传递给 _thread.start_new_thread()
函数,但是,函数不可迭代!
@Willem Van Onsem - 这是完整的代码。使用 Pygame.
class PGMaster:
"""
Properties:
mainloopOn - exits program if False
Functions:
PGMaster.mainlooprunner()
Repeatedly runs Main function (must be overrided).
PgMaster.mainloop(subthread=False)
Wrapper for mainlooprunner. Subthread - will it run under MainThread? No if True.
"""
def winmode(self, dimensions, flags=0, caption='', depth=None):
"""
Flags are:
pygame.FULLSCREEN create a fullscreen display
pygame.DOUBLEBUF recommended for HWSURFACE or OPENGL
pygame.HWSURFACE hardware accelerated, only in FULLSCREEN
pygame.OPENGL create an OpenGL-renderable display
pygame.RESIZABLE display window should be sizeable
pygame.NOFRAME display window will have no border or controls
"""
if depth != None:
screenx = self.screen = pygame.display.set_mode(dimensions, flags, depth)
elif depth == None:
screenx = self.screen = pygame.display.set_mode(dimensions, flags)
pygame.display.set_caption(caption)
return screenx
def __init__(self, dimensions, flags=0, caption='', depth=None):
self.winmode(dimensions, flags, caption, depth)
self.mainloopOn = True
def mainlooprunner(self, function):
func = function
while self.mainloopOn:
func()
def mainlooprunnerx(self, *function):
func = function[0]
while self.mainloopOn:
func()
def mainloop(self, func, subthread=False):
if subthread:
functuple = tuple(func)
_thread.start_new_thread(self.mainlooprunnerx, functuple)
elif not subthread:
self.mainlooprunner(func)
. . .
if __name__ == '__main__':
root = PGMaster([1600, 900], pygame.DOUBLEBUF | pygame.RESIZABLE)
# vvv Real codes vvv
print(pygame.FULLSCREEN)
print(pygame.DOUBLEBUF)
print(pygame.HWSURFACE)
print(pygame.OPENGL)
print(pygame.RESIZABLE)
print(pygame.NOFRAME)
# ^^^ Real codes ^^^
def myloop():
print('Hello World!')
return
root.mainloop(myloop, True)
Output:
Traceback (most recent call last):
File "C:\Users\User\Desktop\PyGameUI\__init__.py", line 127, in <module>
root.mainloop(myloop, True)
File "C:\Users\User\Desktop\PyGameUI\__init__.py", line 100, in mainloop
functuple = tuple(func)
TypeError: 'function' object is not iterable
我想通了。 _thread
实际上 不好。我已经重写了我的代码 - 现在我正在使用 threading
!
我用了 tuple(func)
而不是 tuple((func,))
我正在使用 _thread
模块(因为它更适合我的程序)并且我想将一个函数传递到我传递给线程的函数中。但是,可以仅将 元组 传递给 _thread.start_new_thread()
函数,但是,函数不可迭代!
@Willem Van Onsem - 这是完整的代码。使用 Pygame.
class PGMaster:
"""
Properties:
mainloopOn - exits program if False
Functions:
PGMaster.mainlooprunner()
Repeatedly runs Main function (must be overrided).
PgMaster.mainloop(subthread=False)
Wrapper for mainlooprunner. Subthread - will it run under MainThread? No if True.
"""
def winmode(self, dimensions, flags=0, caption='', depth=None):
"""
Flags are:
pygame.FULLSCREEN create a fullscreen display
pygame.DOUBLEBUF recommended for HWSURFACE or OPENGL
pygame.HWSURFACE hardware accelerated, only in FULLSCREEN
pygame.OPENGL create an OpenGL-renderable display
pygame.RESIZABLE display window should be sizeable
pygame.NOFRAME display window will have no border or controls
"""
if depth != None:
screenx = self.screen = pygame.display.set_mode(dimensions, flags, depth)
elif depth == None:
screenx = self.screen = pygame.display.set_mode(dimensions, flags)
pygame.display.set_caption(caption)
return screenx
def __init__(self, dimensions, flags=0, caption='', depth=None):
self.winmode(dimensions, flags, caption, depth)
self.mainloopOn = True
def mainlooprunner(self, function):
func = function
while self.mainloopOn:
func()
def mainlooprunnerx(self, *function):
func = function[0]
while self.mainloopOn:
func()
def mainloop(self, func, subthread=False):
if subthread:
functuple = tuple(func)
_thread.start_new_thread(self.mainlooprunnerx, functuple)
elif not subthread:
self.mainlooprunner(func)
. . .
if __name__ == '__main__':
root = PGMaster([1600, 900], pygame.DOUBLEBUF | pygame.RESIZABLE)
# vvv Real codes vvv
print(pygame.FULLSCREEN)
print(pygame.DOUBLEBUF)
print(pygame.HWSURFACE)
print(pygame.OPENGL)
print(pygame.RESIZABLE)
print(pygame.NOFRAME)
# ^^^ Real codes ^^^
def myloop():
print('Hello World!')
return
root.mainloop(myloop, True)
Output:
Traceback (most recent call last): File "C:\Users\User\Desktop\PyGameUI\__init__.py", line 127, in <module> root.mainloop(myloop, True) File "C:\Users\User\Desktop\PyGameUI\__init__.py", line 100, in mainloop functuple = tuple(func) TypeError: 'function' object is not iterable
我想通了。 _thread
实际上 不好。我已经重写了我的代码 - 现在我正在使用 threading
!
我用了 tuple(func)
而不是 tuple((func,))