是否有一种很好的 Pythonic 方式来命名列表中的索引偏移量?
我有一个列表列表,每个列表代表我的脚本将设置的一个帐户:
# un pw doit admin
ExtraAccounts = [["Fred", "fredpw1", True, False],
["Jane", "ibjane", True, True],
["Wen", "35syzwen", False, True],
]
所以用户名“Fred”将设置为密码“fredpw1”,并且不会成为管理员。等等
每个子列表的索引[0]是用户名,[1]是密码,[3]是帐户是否是管理员。
这导致代码如下:
for acct in ExtraAccounts:
if acct[2]:
setupAccount(acct[0], acct[1], acct[3])
很难读懂,因为 acct[0]、acct[1]、acct[2] 等代表的内容远非显而易见。
我想到了使用命名元组,但是我还需要在程序中更改列表的内容,像这样:
for acct in ExtraAccounts:
acct[2] = aComplicatedFunction(acct[0])
所以我拒绝使用命名元组,因为它们是不可变的。
我想出了一个解决方法:
User = 0 # index offsets
Pass = 1
Doit = 2
Admin = 3
# un pw doit admin
ExtraAccounts = [["Fred", "fredpw1", True, False],
["Jane", "ibjane", True, True],
["Wen", "35syzwen", False, True],
]
for acct in ExtraAccounts:
acct[Doit] = aComplicatedFunction(acct[User])
for acct in ExtraAccounts:
if acct[Doit]:
setupAccount(acct[User], acct[Pass], acct[Admin])
...但我很确定这不是执行此操作的“正确方法”。
什么是更好的方法?
请您参考如下方法:
要上课吗?
class Account:
def __init__(self, username, password, doit, admin):
self.username = username
self.password = password
self.doit = doit
self.admin = admin
extra_accounts = [
# un pw doit admin
Account("Fred", "fredpw1", True, False),
Account("Jane", "ibjane", True, True),
Account("Wen", "35syzwen", False, True),
]
for acct in extra_accounts:
acct.doit = a_complicated_function(acct.username)
for acct in extra_accounts:
if acct.doit:
setup_account(acct.username, acct.password, acct.admin)
