Dans le code Python d'AWS Lambda, j'ai créé une fonction qui renvoie un résultat basé sur une date spécifiée (il y a un an si non spécifié).
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):
#Fonction en question
def test_func(last_time: str = one_year_ago) -> str:
return "last_time: " + last_time
print(one_year_ago)
#Où la fonction est appelée
print(test_func("2019-09-20T06:28:26.000Z"))
print(test_func())
return 0
lambda_handler("","")
Résultat de l'exécution
2018-12-08T20:22:57.183Z
last_time: 2019-09-20T06:28:26.000Z
last_time: 2018-12-08T20:22:57.183Z
Selon les [Best Practices] d'AWS Lambda (https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/best-practices.html#function-code), il est préférable de séparer la logique. Parce que c'était une chose, je l'ai corrigée comme suit.
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)
#Où la fonction est appelée
print(test_func("2019-09-20T06:28:26.000Z"))
print(test_func())
return 0
#Fonction en question
def test_func(last_time: str = one_year_ago) -> str:
return "last_time: " + last_time
lambda_handler("","")
--Autre que la partie gestionnaire Lambda, elle n'est appelée qu'au moment du démarrage à froid [^ 1], elle est donc dans le gestionnaire à demander il y a un an.
- Par conséquent, le premier code lui-même ne fonctionne pas correctement.
--Définissez à l'avance la variable avec des caractères vides (sinon elle sera "non définie").
Qu'est-il arrivé
Cela fonctionne lorsque vous spécifiez une date, mais une erreur se produit si vous ne la spécifiez pas. La valeur par défaut semble être désactivée.
Résultat de l'exécution
2018-12-08T20:15:21.611Z
last_time: 2019-09-20T06:28:26.000Z
last_time:
- Le code réel lançait une requête boto3 et l'erreur InvalidParameterValueException [^ 2] a été générée.
Conclusion
Étant donné que l'argument par défaut n'est évalué que pour la première fois, le premier caractère vide a été défini.
https://note.nkmk.me/python-argument-default/
Je pense que ce n'est pas cool, mais je l'ai évité en faisant ce qui suit pour le moment.
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)
#Où la fonction est appelée
print(test_func("2019-09-20T06:28:26.000Z"))
print(test_func())
return 0
#Fonction en question
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("","")
Résultat de l'exécution
2018-12-08T20:21:13.942Z
last_time: 2019-09-20T06:28:26.000Z
last_time: 2018-12-08T20:21:13.942Z
De côté
«Je pense qu'il semble y avoir une plus belle façon d'écrire.
«On a l'impression d'être obligé de demander il y a un an. ..
one_year_ago = (datetime.now() - relativedelta(years=1)).isoformat()[:-3] + "Z"
--En fait, je souhaite stocker l'historique des requêtes de support AWS dans DynamoDB, J'écris ce 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
Recommended Posts