Une histoire sur l'écriture d'AWS Lambda et de devenir un peu accro aux valeurs par défaut des arguments Python

Contexte

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

Une histoire sur l'écriture d'AWS Lambda et de devenir un peu accro aux valeurs par défaut des arguments Python
Une histoire à laquelle j'étais accro à appeler Lambda depuis AWS Lambda.
[Python] J'ai écrit une API REST en utilisant AWS API Gateway et Lambda.
Le nom du fichier était mauvais en Python et j'étais accro à l'importation
Utilisez AWS lambda pour récupérer les actualités et notifier régulièrement LINE des mises à jour [python]
C'était une vie que je voulais faire de l'OCR sur AWS Lambda pour localiser les personnages.
Je veux connaître la nature de Python et pip
[Réparer] J'étais accro au jugement alphanumérique des chaînes Python
J'ai été surpris de recevoir une belle critique lorsque j'ai écrit Python à CheckIO et son explication
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
J'ai écrit un script pour créer rapidement un environnement de développement pour Twitter Bot avec AWS Lambda + Python 2.7
[Introduction à Python] J'ai comparé les conventions de nommage de C # et Python.
J'ai écrit le code pour écrire le code Brainf * ck en python
Je souhaite utiliser à la fois la clé et la valeur de l'itérateur Python
J'étais accro aux variables de classe et aux variables d'instance erronées en Python
[Python] Le rôle de l'astérisque devant la variable. Divisez la valeur d'entrée et affectez-la à une variable
Je veux clarifier la question de la méthode "__init__" et de l'argument "self" de la classe Python.
Ce que j'étais accro à Python autorun
Je voulais faire attention au comportement des arguments par défaut de Python
J'étais accro à la création d'un environnement Python venv avec VS Code
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
J'ai créé une fonction pour voir le mouvement d'un tableau à deux dimensions (Python)
[Fabric] J'étais accro à l'utilisation de booléen comme argument, alors notez les contre-mesures.
Python: j'ai pu récurer en lambda
J'ai écrit une classe en Python3 et Java
Résumé de l'étude de Python pour utiliser AWS Lambda
Prise en compte des forces et faiblesses de Python
Trois choses auxquelles j'étais accro lors de l'utilisation de Python et MySQL avec Docker
AtCoder AGC 041 C - J'étais accro à la recherche complète de Domino Quality
Créez un environnement python pour apprendre la théorie et la mise en œuvre de l'apprentissage profond
Une note à laquelle j'étais accro lors de l'exécution de Python avec Visual Studio Code
J'ai fait un script pour enregistrer la fenêtre active en utilisant win32gui de Python
Une histoire à laquelle j'étais accro après la communication SFTP avec python
Notez que j'étais accro à la configuration de TensowFlow
Je pensais que c'était la même chose que python, et j'étais accro au problème que l'interpréteur ruby ne démarre pas.
[Python & SQLite] J'ai analysé la valeur attendue d'une course avec des chevaux dans la fourchette 1x win ①
Création d'un bot Slack qui confirme et notifie à AWS Lambda la date d'expiration d'un certificat SSL
J'étais sobrement accro à appeler awscli à partir d'un script Python 2.7 enregistré dans crontab
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
[Introduction aux statistiques] Quel type de distribution est la distribution t, la distribution chi carré et la distribution F? Un petit résumé de l'utilisation de [python]
J'ai essayé d'automatiser la mise à jour de l'article du blog Livedoor avec Python et sélénium.
Le concept de référence en Python s'est effondré un instant, j'ai donc expérimenté un peu.
J'ai vérifié les versions de Blender et Python
J'étais accro au grattage avec Selenium (+ Python) en 2020
Essayez d'exécuter Schedule pour démarrer et arrêter des instances dans AWS Lambda (Python)
C'était un peu difficile de faire flacon avec la version docker de nginx-unit
J'ai vérifié le système d'exploitation et le shell par défaut de docker-machine
Je veux AWS Lambda avec Python sur Mac!
Une histoire à laquelle j'étais accro chez np.where
[Python & SQLite] J'ai analysé la valeur attendue d'une course avec des chevaux dans la fourchette 1x win ②
Le moment auquel la valeur de l'argument par défaut est évaluée diffère entre Ruby et Python.
Python: peut être répété en lambda
Une petite histoire à savoir comme un point addictif lors de l'écriture d'applications Twilio à l'aide de Python sur AWS Lambda