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