From 69f1ebc503e4b64a33d3e60892275488152a5425 Mon Sep 17 00:00:00 2001 From: XANTRONIX Industrial Date: Fri, 31 Oct 2025 20:31:19 -0400 Subject: [PATCH] Avoid issues with early evaluation of argument defaults --- bin/nexrad-archive-afos-ingest | 4 ++++ lib/nexrad/db.py | 30 ++++++++++++++++++------------ lib/nexrad/util.py | 2 ++ 3 files changed, 24 insertions(+), 12 deletions(-) create mode 100644 lib/nexrad/util.py diff --git a/bin/nexrad-archive-afos-ingest b/bin/nexrad-archive-afos-ingest index f23eef3..3a25cef 100755 --- a/bin/nexrad-archive-afos-ingest +++ b/bin/nexrad-archive-afos-ingest @@ -1,6 +1,7 @@ #! /usr/bin/env python3 import sys +import argparse from nexrad.db import Database from nexrad.afos import AFOSMessageParser @@ -27,6 +28,9 @@ def each_chunk(fh, sep: str): else: yield part.strip() +ap = argparse.ArgumentParser(description='Ingest bulk AFOS text messages') +ap.add_argument('--poly-only', action='store_true', help='Ingest only AFOS messages with geographic bounding polygons') + db = Database.connect(sys.argv[1]) db.execute('begin transaction') diff --git a/lib/nexrad/db.py b/lib/nexrad/db.py index 5fbff8a..a6db564 100644 --- a/lib/nexrad/db.py +++ b/lib/nexrad/db.py @@ -1,6 +1,8 @@ import enum import sqlite3 +from nexrad.util import default + class DatabaseOrder(enum.Enum): DEFAULT = 0 ASC = 1 @@ -210,13 +212,15 @@ class Database(): self.db.execute(sql, values) - def query_sql(self, table, sql, values=list()): + def query_sql(self, table, sql, values=None): cr = DatabaseTableCursor(table, self.db.cursor()) - cr.execute(sql, values) + cr.execute(sql, default(values, list())) return cr - def query(self, table, values=dict(), order_by=list()): + def query(self, table, values=None, order_by=None): + values = default(values, dict()) + order_by = default(order_by, list()) selectors = getattr(table, '__columns_read__', None) if selectors is None: @@ -253,10 +257,12 @@ class Database(): return self.query_sql(table, sql, list(values.values())) - def get(self, table, values: dict=dict()): - return self.query(table, values).fetchone() + def get(self, table, values: dict=None): + return self.query(table, default(values, dict())).fetchone() + + def _call(self, table, fn: str, column: str, values: dict=None) -> int: + values = default(values, dict()) - def _call(self, table, fn: str, column: str, values: dict=dict()) -> int: sql = f"select {fn}({column}) as ret from {table.__table__}" if len(values) > 0: @@ -267,11 +273,11 @@ class Database(): return row[0] if row is not None else None - def min(self, table, column: str, values: dict=dict()) -> int: - return self._call(table, 'min', column, values) + def min(self, table, column: str, values: dict=None) -> int: + return self._call(table, 'min', column, default(values, dict())) - def max(self, table, column: str, values: dict=dict()) -> int: - return self._call(table, 'max', column, values) + def max(self, table, column: str, values: dict=None) -> int: + return self._call(table, 'max', column, default(values, dict())) - def count(self, table, values: dict=dict()) -> int: - return self._call(table, 'count', table.__key__, values) + def count(self, table, values: dict=None) -> int: + return self._call(table, 'count', table.__key__, default(values, dict())) diff --git a/lib/nexrad/util.py b/lib/nexrad/util.py new file mode 100644 index 0000000..587feb6 --- /dev/null +++ b/lib/nexrad/util.py @@ -0,0 +1,2 @@ +def default(a, b): + return b if a is None else a