Im Python-Code von AWS Lambda habe ich eine Funktion erstellt, die ein Ergebnis basierend auf einem angegebenen Datum zurückgibt (vor einem Jahr, wenn nicht angegeben).
from datetime import datetime
from dateutil.relativedelta import relativedelta
one_year_ago = (datetime.now() - relativedelta(years=1)).isoformat()[:-3] + "Z"
def lambda_handler(event, context):
#Funktion in Frage
def test_func(last_time: str = one_year_ago) -> str:
return "last_time: " + last_time
print(one_year_ago)
#Wo die Funktion aufgerufen wird
print(test_func("2019-09-20T06:28:26.000Z"))
print(test_func())
return 0
lambda_handler("","")
Ausführungsergebnis
2018-12-08T20:22:57.183Z
last_time: 2019-09-20T06:28:26.000Z
last_time: 2018-12-08T20:22:57.183Z
Laut AWS Lambdas Best Practices ist es besser, die Logik zu trennen. Weil es eine Sache war, habe ich es wie folgt korrigiert.
from datetime import datetime
from dateutil.relativedelta import relativedelta
one_year_ago: str = ""
def lambda_handler(event, context):
global one_year_ago
one_year_ago = (datetime.now() - relativedelta(years=1)).isoformat()[:-3] + "Z"
print(one_year_ago)
#Wo die Funktion aufgerufen wird
print(test_func("2019-09-20T06:28:26.000Z"))
print(test_func())
return 0
#Funktion in Frage
def test_func(last_time: str = one_year_ago) -> str:
return "last_time: " + last_time
lambda_handler("","")
- Anders als das Lambda-Handler-Teil wird es nur zum Zeitpunkt des Kaltstarts aufgerufen [^ 1], daher ist es im Handler, nach einem Jahr zu fragen.
- Daher funktioniert der erste Code selbst nicht richtig.
- Definieren Sie die Variable mit leeren Zeichen im Voraus (andernfalls wird sie "nicht definiert").
Was ist passiert
Es funktioniert, wenn Sie ein Datum angeben, aber ein Fehler tritt auf, wenn Sie es nicht angeben. Der Standardwert scheint deaktiviert zu sein.
Ausführungsergebnis
2018-12-08T20:15:21.611Z
last_time: 2019-09-20T06:28:26.000Z
last_time:
- Der eigentliche Code hat eine boto3-Anfrage ausgelöst und der Fehler InvalidParameterValueException [^ 2] wurde ausgegeben.
Fazit
Da das Standardargument nur zum ersten Mal ausgewertet wird, wurde das erste Leerzeichen gesetzt.
https://note.nkmk.me/python-argument-default/
Ich denke, es ist nicht cool, aber ich habe es vermieden, indem ich vorerst Folgendes getan habe.
Code
from datetime import datetime
from dateutil.relativedelta import relativedelta
one_year_ago: str = ""
def lambda_handler(event, context):
global one_year_ago
one_year_ago = (datetime.now() - relativedelta(years=1)).isoformat()[:-3] + "Z"
print(one_year_ago)
#Wo die Funktion aufgerufen wird
print(test_func("2019-09-20T06:28:26.000Z"))
print(test_func())
return 0
#Funktion in Frage
def test_func(last_time: str = "one_year_ago") -> str:
if last_time == "one_year_ago":
last_time = one_year_ago
return "last_time: " + last_time
lambda_handler("","")
Ausführungsergebnis
2018-12-08T20:21:13.942Z
last_time: 2019-09-20T06:28:26.000Z
last_time: 2018-12-08T20:21:13.942Z
Beiseite
――Ich denke, es scheint eine schönere Art zu schreiben zu geben.
――Das Gefühl, vor einem Jahr nachfragen zu müssen. ..
one_year_ago = (datetime.now() - relativedelta(years=1)).isoformat()[:-3] + "Z"
- Eigentlich möchte ich den Abfrageverlauf der AWS-Unterstützung in DynamoDB speichern, Ich schreibe diesen Code.
def cases_get(last_time: str = "one_year_ago") -> list:
if last_time == "one_year_ago":
last_time = one_year_ago
cases_detail: list = []
for lang in ("ja", "en"):
for page in cases_paginator.paginate(
includeResolvedCases=True,
maxResults=100,
language=lang,
includeCommunications=False,
afterTime=last_time,
):
for cases in page["cases"]:
cases["displayId"] = int(cases["displayId"])
cases["yearIndex"] = int(cases["timeCreated"][:4])
cases_detail.append(cases)
return cases_detail