我正在try 以 struct 化的方式捕获(S3)日志(log).我正在使用这种类型的元组捕获与访问相关的元素:
class _Access(NamedTuple):
time: datetime
ip: str
actor: str
request_id: str
action: str
key: str
request_uri: str
status: int
error_code: str
然后,我有一个使用这个命名元组的类,如下所示(仅编辑到相关代码):
class Logs:
def __init__(self, log: str):
raw_logs = match(S3_LOG_REGEX, log)
if raw_logs is None:
raise FormatError(log)
logs = raw_logs.groups()
timestamp = datetime.strptime(logs[2], "%d/%b/%Y:%H:%M:%S %z")
http_status = int(logs[9])
access = _Access(
timestamp,
logs[3],
logs[4],
logs[5],
logs[6],
logs[7],
logs[8],
http_status,
logs[10],
)
self.access = access
问题是,当我现在想使用它时,它太冗长了:
>>> log_struct = Logs(raw_log)
>>> log_struct.access.action # I don't want to have to add `access`
正如我在上面提到的,我更愿意做这样的事情:
>>> log_struct = Logs(raw_log)
>>> log_struct.action
但我仍然希望将这个干净的命名元组命名为_Access
.我如何才能使从access
开始的所有内容都在顶层可用?
具体地说,我有这样一句话:
self.access = access
这让我多了一层我不想要的"层".我希望能够以某种方式"解开"它,就像我们可以通过传递*args
个星号来解开论点一样.但我不确定在这种情况下如何解包元组.