python - 循环中引用的 Python 更新变量
问题描述
我正在尝试创建一堆目录。其中一些会由于权限和诸如此类的原因而失败,在这种情况下,我希望在其中创建该目录/tmp
,然后替换相应变量中的值。
import os
ROOT = "/var"
IMG_DIR = "images"
HASH_DIR = "hashes"
TEAM_DIR = "teams"
for some_dir in [IMG_DIR, HASH_DIR, TEAM_DIR]:
current_path = os.path.join(ROOT, some_dir)
if not os.path.exists(current_path):
try:
os.makedirs(current_path)
except OSError:
new_path = os.path.join("/tmp", some_dir)
# if the error happened in images, update IMG_DIR with the new path
# if the error happened in hashes, update HASH_DIR with the new path
# if the error happened in teams, update TEAM_DIR with the new path
IMG_DIR
,HASH_DIR
并且TEAM_DIR
将是全局变量,并且可以在整个程序中访问。完成此任务的最优雅/Pythonic 方式是什么?
解决方案
你需要这样的东西:
import os
ROOT = "/var"
my_dirs = {
'IMG_DIR': "images",
'HASH_DIR': "hashes",
'TEAM_DIR': "teams"
}
for name, path in my_dirs.items():
current_path = os.path.join(ROOT, path)
if not os.path.exists(current_path):
try:
os.makedirs(current_path)
except OSError:
new_path = os.path.join("/tmp", path)
my_dirs[name] = new_path
UPD
如果您严格要求更新变量并且不接受字典(为什么??),您可以使用以下方法:
import os
def create_dir(root: str, path: str) -> str:
current_path = os.path.join(root, path)
if not os.path.exists(current_path):
try:
os.makedirs(current_path)
except OSError:
new_path = os.path.join("/tmp", path)
# maybe create this directory here?
return new_path
return current_path
ROOT = "/var"
IMG_DIR = create_dir(ROOT, "images")
HASH_DIR = create_dir(ROOT, "hashes")
TEAM_DIR = create_dir(ROOT, "teams")
推荐阅读
- c# - C# .net 中等效的 SQL XML 数据类型
- r - 计算这些向量的嵌套子集的两个向量的最大值和最小值之间的差
- java - 使用 Apache Commons Net FTPClient 从 FTP 服务器循环读取多个文件
- c# - 检索具有 CLSID 的组件的 COM 类工厂 - 未注册类
- c# - ASP.NET MVC 中的安全登录方法
- eslint - 如何使用 TypeScript 支持全局安装 ESLint?
- java - 多对一没有持久化
- python - 如何解决 ModuleNotFoundError:PyInstaller 中没有名为“srsly.msgpack.util”的模块?
- java - 如何在基于 Debian Java 的 Docker 映像中减少 python 的大小?
- c++ - C ++ std中的条件变量与互斥锁