python输出dict的values去除dict_values前缀
时间: 2024-03-22 11:35:29 浏览: 79
在Python中,可以使用`list()`函数将字典的values转换为列表,并去除`dict_values`前缀。下面是一个示例代码:
```python
my_dict = {'a': 1, 'b': 2, 'c': 3}
values_list = list(my_dict.values())
print(values_list)
```
输出结果将是一个不带`dict_values`前缀的列表:
```
[1, 2, 3]
```
相关问题
给下列代码加注释: def merge_accumulate_client_update(self, list_num_proc, list_state_dict, lr): total_num_proc = sum(list_num_proc) # merged_state_dict = dict() dict_keys = list_state_dict[0].keys() for state_dict in list_state_dict[1:]: assert state_dict.keys() == dict_keys # accumulate extra sgrad and remove from state_dict if self.use_adaptive and self.is_adj_round(): prefix = "extra." for state_dict in list_state_dict: del_list = [] for key, param in state_dict.items(): if key[:len(prefix)] == prefix: sgrad_key = key[len(prefix):] mask_0 = self.model.get_mask_by_name(sgrad_key) == 0. dense_sgrad = torch.zeros_like(mask_0, dtype=torch.float) dense_sgrad.masked_scatter_(mask_0, param) # no need to divide by lr self.control.accumulate(sgrad_key, dense_sgrad) del_list.append(key) for del_key in del_list: del state_dict[del_key]
```python
def merge_accumulate_client_update(self, list_num_proc, list_state_dict, lr):
total_num_proc = sum(list_num_proc)
# merged_state_dict = dict()
dict_keys = list_state_dict[0].keys()
# Check if all state dicts have the same keys
for state_dict in list_state_dict[1:]:
assert state_dict.keys() == dict_keys
# accumulate extra sgrad and remove from state_dict
if self.use_adaptive and self.is_adj_round():
prefix = "extra."
for state_dict in list_state_dict:
del_list = []
for key, param in state_dict.items():
# Check if the key starts with 'extra.'
if key[:len(prefix)] == prefix:
# Get the corresponding sgrad key
sgrad_key = key[len(prefix):]
# Create a mask of zeroes
mask_0 = self.model.get_mask_by_name(sgrad_key) == 0.
# Create a dense tensor and fill it with values from param based on the mask
dense_sgrad = torch.zeros_like(mask_0, dtype=torch.float)
dense_sgrad.masked_scatter_(mask_0, param)
# Accumulate the dense sgrad without dividing by lr
self.control.accumulate(sgrad_key, dense_sgrad)
# Add the key to the delete list
del_list.append(key)
# Remove the keys from the state_dict
for del_key in del_list:
del state_dict[del_key]
```
这段代码实现了一个`merge_accumulate_client_update`方法,主要功能是合并和累加`list_state_dict`中的状态字典。以下是对代码的注释:
- `total_num_proc`:所有进程数的总和。
- `dict_keys`:状态字典的键列表。
- 检查所有状态字典是否具有相同的键。
- 如果使用自适应且处于调整轮次,则累加额外的`sgrad`并从状态字典中删除。
- `prefix`:额外`sgrad`的前缀。
- 对于每个状态字典,遍历键和参数。
- 如果键以`prefix`开头,则获取相应的`sgrad`键。
- 创建一个零填充的掩码。
- 创建一个稠密张量,并根据掩码从参数中填充值。
- 累加不除以`lr`的稠密`sgrad`。
- 将键添加到删除列表。
- 从状态字典中删除键。
class UserCache(UserMixin): """用户表缓存""" userid: str username: str alternative_id: str homepage: str permissions: list def get_id(self): """使用替代用户ID,当账号信息发生变化时,替代ID更改为新的随机生成的值,确保他们的旧身份验证会话不再有效。""" return self.alternative_id @staticmethod def add_user_cache(alternative_id: str, **kwargs): """添加user缓存""" user_key = f"{PROJECT_NAME}-{alternative_id}" values = {"alternative_id": alternative_id} values.update(kwargs) redis_client.hmset(user_key, values) redis_client.expire(user_key, SIGNIN_LIFETIME) return True @staticmethod def del_user_cache(alternative_id: str): """删除user缓存""" redis_client.delete(f"{PROJECT_NAME}-{alternative_id}") return True @staticmethod def get_user_cache(alternative_id) -> object: """获取user缓存""" user_cache_dict = redis_client.hgetall(f"{PROJECT_NAME}-{alternative_id}") if user_cache_dict: user_cache = UserCache() user_cache.userid = user_cache_dict.get('userid') user_cache.username = user_cache_dict.get('username') user_cache.alternative_id = user_cache_dict.get('alternative_id') user_cache.homepage = user_cache_dict.get('homepage') user_cache.permissions = user_cache_dict.get('permissions').split(",") # redis里存的是字符串,转为列表 return user_cache 帮我检查和优化代码,包括命名是否优雅
以下是对代码的检查和优化建议:
1. 类名 `UserCache` 可能不太恰当,因为它并不是缓存类,而是一个用户类,可以考虑将其重命名为 `User`。
2. 类属性的命名建议使用下划线分隔的小写字母单词,例如 `alternative_id` 可以改为 `alternative_id`。
3. `get_id` 方法可以直接返回 `alternative_id` 属性,不必声明一个方法。
4. `add_user_cache` 和 `del_user_cache` 方法可以改为实例方法,而不是静态方法。这样更符合面向对象的编程习惯。
5. `get_user_cache` 方法可以使用字典解析式来简化代码:
```python
@classmethod
def get_user_cache(cls, alternative_id):
"""获取用户缓存"""
user_cache_dict = redis_client.hgetall(f"{PROJECT_NAME}-{alternative_id}")
if user_cache_dict:
user_cache_dict['permissions'] = user_cache_dict['permissions'].split(",")
return cls(**user_cache_dict)
```
这里使用了类方法,因为该方法需要返回一个 `User` 实例。
6. 如果要使用 `User` 类来代替 Flask-Login 提供的默认用户类,可以让 `User` 类继承 `Flask-Login` 提供的 `UserMixin` 类。
7. 为了防止 Redis 中的键名与其他应用程序冲突,可以在键名前添加一个前缀,例如 `"{PROJECT_NAME}-user-{alternative_id}"`。
8. 为了增强代码的可维护性和可读性,可以为 Redis 客户端和键名添加公共前缀,例如:
```python
class User(UserMixin):
REDIS_PREFIX = f"{PROJECT_NAME}-user"
def __init__(self, alternative_id, userid=None, username=None, homepage=None, permissions=None):
self.alternative_id = alternative_id
self.userid = userid
self.username = username
self.homepage = homepage
self.permissions = permissions or []
def get_id(self):
return self.alternative_id
def add_to_cache(self):
values = {
"alternative_id": self.alternative_id,
"userid": self.userid,
"username": self.username,
"homepage": self.homepage,
"permissions": ",".join(self.permissions),
}
redis_key = f"{self.REDIS_PREFIX}:{self.alternative_id}"
redis_client.hmset(redis_key, values)
redis_client.expire(redis_key, SIGNIN_LIFETIME)
def delete_from_cache(self):
redis_client.delete(f"{self.REDIS_PREFIX}:{self.alternative_id}")
@classmethod
def load_from_cache(cls, alternative_id):
redis_key = f"{cls.REDIS_PREFIX}:{alternative_id}"
user_cache_dict = redis_client.hgetall(redis_key)
if user_cache_dict:
user_cache_dict['permissions'] = user_cache_dict.get('permissions', '').split(",")
return cls(**user_cache_dict)
```
这样可以使代码更加清晰,也可以方便地更改 Redis 前缀。
阅读全文