存储生成器产生的值以供多次使用
Storing the values produced by a generator for multiple uses
我正在开发一个程序,它将检查用户的硬盘驱动器是否有游戏,并显示计算机上安装的所有游戏的列表以及相关名称和路径。
我通过在 JSON 中创建一个数据库来实现这一点,该数据库包含每个游戏的名称和路径(该程序在 linux 和 windows 上运行,因此有 4 个值database: name, windows_path, windows_steam_path, linux_path, linux_steam_path) *Steam路径是为了检查游戏是否使用了steam cloud
"name",
"Windows_path",
"Windows_steam_path",
"Linux_path",
"Linux_sync_path"
我还需要为每个游戏创建一个 "Template",所以我为他们创建了一个 class
class Game():
def __init__(self, game_name, game_path, sync_path):
self.name = game_name
self.path = game_path
self.sync_path = sync_path
def to_dict(self):
self.name
self.path
self.sync_path
return {"name": self.name, "path": self.path, "sync_path": self.sync_path}
而且我还需要一个用户界面 Eel - https://github.com/ChrisKnott/Eel
Eel 托管一个本地网络服务器,所以我将使用 HTML 个文件来显示内容
<nav class="navbar navbar-expand-lg navbar-light bg-dark" Style="display:block; height:50px">
<a href="../index.html" class="btn btn-info float-left">Home</a>
<a href="userGuide.html" class="btn btn-info float-right">User Guide</a>
</nav>
<div id="game_database" class="row"></div>
现在我像这样从数据库中获取数据
save_database = json.load(open("database.json"))
def load_game(db_item):
current_os = platform.system()
path = ""
sync_path = ""
[name, win_path, win_sync, lin_path, lin_sync] = db_item
if current_os == "Windows":
sync_path = win_sync
path = win_path
print(path, sync_path)
else:
sync_path = lin_sync
path = lin_path
print(path, sync_path)
print(Game(name, os.path.expanduser(path), os.path.expanduser(sync_path)))
return Game(name, os.path.expanduser(path), os.path.expanduser(sync_path))
save_database = map(load_game, save_database)
并将数据传入字典
def get_all_in_database():
for game in save_database:
game_dict = game.to_dict()
yield game_dict
然后我使用 lodash 创建了一个模板,并使用 javascript 和 jquery 修改了 html 并调用了 python 函数(我没有发布该代码在这里,因为这已经是一个很大的问题了)
当我转到我想要的页面时,它会调用 javascript 函数,该函数调用所有其他函数并通过模板等发送数据。一切正常,但只有一次。
如果我刷新页面或再次调用该函数,它应该会显示游戏,但它不会;它给我的只是一个空列表 []
因为当我将函数公开给 javascript 我列出(它))
[{'name': 'Portal 2', 'path': 'NFL', 'sync_path': '~./steam/steam/userdata/XXXXX/game/remote/'}]
Listing games
[]
我四处搜索并问了一些朋友,发现 yield 是一个生成器,只迭代一次值,而且它是不可重用的,所以我想这与此有关,但我也希望能够即时生成值并 "keep" 它们供以后使用,因此由于我对 python 和一般编程的知识有限
目前我有点迷失了如何进行
在 get_all_in_database
函数中使用 return
代替 yield
,并将它们添加到新列表中。
def get_all_in_database():
newlist = []
for game in save_database:
newlist.append(game.to_dict())
return newlist
感谢我的一个朋友,我找到了自己问题的答案(为 fabiosantoscode 鼓掌 - https://github.com/fabiosantoscode)
正如你所见,当我最后从 json 导入数据库时,我做了
save_database = map(load_game, save_database)
地图是一个生成器,如果我只需要
save_database = list(map(load_game, save_database))
我不会连续 3 天用头撞墙哈哈
感谢大家的关注!!
我正在开发一个程序,它将检查用户的硬盘驱动器是否有游戏,并显示计算机上安装的所有游戏的列表以及相关名称和路径。
我通过在 JSON 中创建一个数据库来实现这一点,该数据库包含每个游戏的名称和路径(该程序在 linux 和 windows 上运行,因此有 4 个值database: name, windows_path, windows_steam_path, linux_path, linux_steam_path) *Steam路径是为了检查游戏是否使用了steam cloud
"name",
"Windows_path",
"Windows_steam_path",
"Linux_path",
"Linux_sync_path"
我还需要为每个游戏创建一个 "Template",所以我为他们创建了一个 class
class Game():
def __init__(self, game_name, game_path, sync_path):
self.name = game_name
self.path = game_path
self.sync_path = sync_path
def to_dict(self):
self.name
self.path
self.sync_path
return {"name": self.name, "path": self.path, "sync_path": self.sync_path}
而且我还需要一个用户界面 Eel - https://github.com/ChrisKnott/Eel
Eel 托管一个本地网络服务器,所以我将使用 HTML 个文件来显示内容
<nav class="navbar navbar-expand-lg navbar-light bg-dark" Style="display:block; height:50px">
<a href="../index.html" class="btn btn-info float-left">Home</a>
<a href="userGuide.html" class="btn btn-info float-right">User Guide</a>
</nav>
<div id="game_database" class="row"></div>
现在我像这样从数据库中获取数据
save_database = json.load(open("database.json"))
def load_game(db_item):
current_os = platform.system()
path = ""
sync_path = ""
[name, win_path, win_sync, lin_path, lin_sync] = db_item
if current_os == "Windows":
sync_path = win_sync
path = win_path
print(path, sync_path)
else:
sync_path = lin_sync
path = lin_path
print(path, sync_path)
print(Game(name, os.path.expanduser(path), os.path.expanduser(sync_path)))
return Game(name, os.path.expanduser(path), os.path.expanduser(sync_path))
save_database = map(load_game, save_database)
并将数据传入字典
def get_all_in_database():
for game in save_database:
game_dict = game.to_dict()
yield game_dict
然后我使用 lodash 创建了一个模板,并使用 javascript 和 jquery 修改了 html 并调用了 python 函数(我没有发布该代码在这里,因为这已经是一个很大的问题了)
当我转到我想要的页面时,它会调用 javascript 函数,该函数调用所有其他函数并通过模板等发送数据。一切正常,但只有一次。
如果我刷新页面或再次调用该函数,它应该会显示游戏,但它不会;它给我的只是一个空列表 []
因为当我将函数公开给 javascript 我列出(它))
[{'name': 'Portal 2', 'path': 'NFL', 'sync_path': '~./steam/steam/userdata/XXXXX/game/remote/'}]
Listing games
[]
我四处搜索并问了一些朋友,发现 yield 是一个生成器,只迭代一次值,而且它是不可重用的,所以我想这与此有关,但我也希望能够即时生成值并 "keep" 它们供以后使用,因此由于我对 python 和一般编程的知识有限
目前我有点迷失了如何进行在 get_all_in_database
函数中使用 return
代替 yield
,并将它们添加到新列表中。
def get_all_in_database():
newlist = []
for game in save_database:
newlist.append(game.to_dict())
return newlist
感谢我的一个朋友,我找到了自己问题的答案(为 fabiosantoscode 鼓掌 - https://github.com/fabiosantoscode)
正如你所见,当我最后从 json 导入数据库时,我做了
save_database = map(load_game, save_database)
地图是一个生成器,如果我只需要
save_database = list(map(load_game, save_database))
我不会连续 3 天用头撞墙哈哈
感谢大家的关注!!