Skip to main content
 首页 » 编程设计

python之基于字符串迭代声明变量

2025年05月04日38exmyth

不确定以前是否有人问过这个问题。这是一个有点奇怪的问题,所以我会继续说下去。

我有一些变量(或者更确切地说是常量)定义:

# Constants 
 
# Colors 
RED="RED" 
ORANGE="ORANGE" 
YELLOW="YELLOW" 
GREEN="GREEN" 
CYAN="CYAN" 
BLUE="BLUE" 
MAGENTA="MAGENTA" 
# Modes 
PANIC="PANIC" 
SOLID="SOLID" 
BREATHING="BREATHING" 
# Special sub-modes (for panic) 
BLINKING="BLINKING" 
 
# Declare them 
SOLID_RED="{}_{}".format(SOLID,RED) 
SOLID_BLUE="{}_{}".format(SOLID,BLUE) 
SOLID_MAGENTA="{}_{}".format(SOLID,MAGENTA) 
## .. 
BREATHING_RED="{}_{}".format(BREATHING,RED) 
BREATHING_BLUE="{}_{}".format(BREATHING,BLUE) 
BREATHING_MAGENTA="{}_{}".format(BREATHING,MAGENTA) 
## .. 
PANIC_RED="{}_{}".format(PANIC,RED) 
PANIC_BLUE="{}_{}".format(PANIC,BLUE) 
PANIC_MAGENTA="{}_{}".format(PANIC,MAGENTA) 
## .. 
PANIC_BLINKING="{}_{}".format(PANIC,BLINKING) 

我有很多定义!不必像这样将它们全部键入,是否有一种方法可以让我仅使用 # declare them 之前的定义将所有这些常量构造为字符串,或者使用,比方说,字典?

对于这种迭代构造,我需要的格式是:MODE_COLOR 命名约定。

我要求此答案适用于 Python 2.7。因为我有一些依赖的 2.7 APIs。

请您参考如下方法:

另一种使用 itertools.combinations 和 locals() 的方法:

from itertools import combinations 
from pprint import pprint 
 
# Colors 
RED="RED" 
ORANGE="ORANGE" 
YELLOW="YELLOW" 
GREEN="GREEN" 
CYAN="CYAN" 
BLUE="BLUE" 
MAGENTA="MAGENTA" 
# Modes 
PANIC="PANIC" 
SOLID="SOLID" 
BREATHING="BREATHING" 
# Special sub-modes (for panic) 
BLINKING="BLINKING" 
 
v_consts = {k:v for k, v in locals().items() if k.isupper()} 
combs = combinations(v_consts.values(), 2) 
d_consts = {'%s_%s' % k: '%s_%s' % k for k  in combs} 
pprint(d_consts) 
 
# Edit: 
# If you want to add the created variables in Python's scope 
# You can do something like this 
globals().update(d_consts) 
print SOLID_BLINKING, type(SOLID_BLINKING) 

输出:

{'BLINKING_CYAN': 'BLINKING_CYAN', 
 'BLINKING_MAGENTA': 'BLINKING_MAGENTA', 
 'BLINKING_ORANGE': 'BLINKING_ORANGE', 
 'BLINKING_PANIC': 'BLINKING_PANIC', 
 'BLINKING_RED': 'BLINKING_RED', 
  ... 
 'YELLOW_MAGENTA': 'YELLOW_MAGENTA', 
 'YELLOW_ORANGE': 'YELLOW_ORANGE', 
 'YELLOW_PANIC': 'YELLOW_PANIC', 
 'YELLOW_RED': 'YELLOW_RED'} 
 SOLID_BLINKING <type 'str'>