Eine Geschichte über das Schreiben von AWS Lambda und ein wenig Abhängigkeit von den Standardwerten von Python-Argumenten

Hintergrund

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"
  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

Eine Geschichte über das Schreiben von AWS Lambda und ein wenig Abhängigkeit von den Standardwerten von Python-Argumenten
Eine Geschichte, die ich süchtig danach war, Lambda von AWS Lambda anzurufen.
[Python] Ich habe eine REST-API mit AWS API Gateway und Lambda geschrieben.
Der Dateiname war in Python schlecht und ich war süchtig nach Import
Verwenden Sie AWS Lambda, um Nachrichten zu kratzen und LINE regelmäßig über Updates zu informieren [Python]
Es war ein Leben, das ich auf AWS Lambda OCR wollte, um die Charaktere zu lokalisieren.
Ich möchte die Natur von Python und Pip kennenlernen
[Fix] Ich war süchtig nach dem alphanumerischen Urteil über Python-Strings
Ich war überrascht, eine nette Rezension zu erhalten, als ich Python an CheckIO und seine Erklärung schrieb
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".
Ich habe ein Skript geschrieben, um mit AWS Lambda + Python 2.7 schnell eine Entwicklungsumgebung für Twitter Bot zu erstellen
[Einführung in Python] Ich habe die Namenskonventionen von C # und Python verglichen.
Ich habe den Code geschrieben, um den Brainf * ck-Code in Python zu schreiben
Ich möchte sowohl den Schlüssel als auch den Wert des Python-Iterators verwenden
Ich war süchtig nach falschen Klassenvariablen und Instanzvariablen in Python
[Python] Die Rolle des Sterns vor der Variablen. Teilen Sie den Eingabewert und weisen Sie ihn einer Variablen zu
Ich möchte die Frage nach der Methode "__init__" und dem Argument "self" der Python-Klasse klären.
Was ich süchtig nach Python Autorun war
Ich wollte vorsichtig mit dem Verhalten der Standardargumente von Python sein
Ich war süchtig danach, eine Python-Venv-Umgebung mit VS Code zu erstellen
Ich habe versucht, die Beschleunigung von Python durch Cython zu verifizieren und zu analysieren
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
Ich habe eine Funktion erstellt, um die Bewegung eines zweidimensionalen Arrays (Python) zu sehen.
[Fabric] Ich war süchtig danach, Boolesche Werte als Argument zu verwenden. Notieren Sie sich also die Gegenmaßnahmen.
Python: Ich konnte in Lambda rekursieren
Ich habe eine Klasse in Python3 und Java geschrieben
Zusammenfassung des Studiums von Python zur Verwendung von AWS Lambda
Berücksichtigung der Stärken und Schwächen von Python
Drei Dinge, von denen ich süchtig war, als ich Python und MySQL mit Docker verwendete
AtCoder AGC 041 C - Ich war süchtig nach der vollständigen Suche nach Domino-Qualität
Erstellen Sie eine Python-Umgebung, um die Theorie und Implementierung von Deep Learning zu erlernen
Ein Hinweis, dem ich beim Ausführen von Python mit Visual Studio Code verfallen war
Ich habe ein Skript erstellt, das das aktive Fenster mit win32gui von Python aufzeichnet
Eine Geschichte, der ich nach der SFTP-Kommunikation mit Python verfallen war
Beachten Sie, dass ich süchtig danach war, TensowFlow einzurichten
Ich dachte, es sei dasselbe wie Python, und ich war süchtig nach dem Problem, dass der Ruby-Interpreter nicht gestartet wurde.
[Python & SQLite] Ich habe den erwarteten Wert eines Rennens mit Pferden im 1x-Gewinnbereich ① analysiert
Erstellt einen Slack-Bot, der AWS Lambda über das Ablaufdatum eines SSL-Zertifikats bestätigt und benachrichtigt
Ich war nüchtern süchtig danach, awscli von einem in crontab registrierten Python 2.7-Skript aus aufzurufen
Ich habe versucht, das Update von "Werde ein Romanautor" mit "IFTTT" und "Werde ein Romanautor API" zu benachrichtigen.
[Einführung in die Statistik] Welche Art von Verteilung ist die t-Verteilung, die Chi-Quadrat-Verteilung und die F-Verteilung? Eine kleine Zusammenfassung der Verwendung von [Python]
Ich habe versucht, das Artikel-Update des Livedoor-Blogs mit Python und Selen zu automatisieren.
Das Konzept der Referenz in Python brach für einen Moment zusammen, also experimentierte ich ein bisschen.
Ich habe mir die Versionen von Blender und Python angesehen
Ich war süchtig danach, 2020 mit Selen (+ Python) zu kratzen
Versuchen Sie, Schedule auszuführen, um Instanzen in AWS Lambda (Python) zu starten und zu stoppen.
Mit der Docker-Version der Nginx-Einheit war es ein wenig schwierig, eine Flasche zu machen
Ich habe das Standardbetriebssystem und die Shell der Docker-Maschine überprüft
Ich möchte Lambda mit Python auf Mac AWS!
Eine Geschichte, von der ich bei np.where süchtig war
[Python & SQLite] Ich habe den erwarteten Wert eines Rennens mit Pferden im 1x-Gewinnbereich ② analysiert
Der Zeitpunkt, zu dem der Wert des Standardarguments ausgewertet wird, unterscheidet sich zwischen Ruby und Python.
Python: Kann in Lambda wiederholt werden
Eine kleine Geschichte, die beim Schreiben von Twilio-Anwendungen mit Python auf AWS Lambda süchtig macht