scripts: csv.py: Tweaked --list-computed to infer all input field types

On one hand, only inferring the used input fields is conceptually
correct because that's how csv.py works. On the other, it doesn't really
make sense for --list-computed to show _less_ information than
--list-fields.

So, showing all inferred types now:

  $ ./scripts/csv.py --list-computed test.csv \
        -bcase='%(case)s+%(m)s' \
        -fsimtime='float(bench_simtime)/1.0e9' \
        -fsimthroughput='float(n)/max(float(bench_simtime)/1.0e9,1.0e-9)'
  i              int   .-->  case           ?    ?
  suite          ?     |.->  simtime        int  sum
  case           ?    -+|.>  simthroughput  int  sum
  SKIP_WARMUP    int   |||
  FILE_SIZE      int   |||
  SEED           int   |||
  ...
  m              ?    -'||
  n              int  ---+
  bench_reads    int    ||
  bench_progs    int    ||
  bench_erases   int    ||
  bench_readed   int    ||
  bench_progged  int    ||
  bench_erased   int    ||
  bench_simtime  int  ---'

I think this makes --list-computed a strict superset of --list-fields
now.
This commit is contained in:
Christopher Haster
2026-01-24 05:12:17 -06:00
parent 60dec6b77d
commit 6093fa79ac
+29 -6
View File
@@ -2391,11 +2391,34 @@ def list_fields(csv_paths, **args):
for k, t in zip(fields_, types__): for k, t in zip(fields_, types__):
print('%-*s %s' % (w[0], k, t)) print('%-*s %s' % (w[0], k, t))
def list_computed(Result, **args): def list_computed(fields_, results, Result, **args):
# figure out input fields and types, these are stashed in the # find best type for fields, note this matches compile behavior
# compiled Result type for this sort of introspection types_ = {}
fields_ = Result._fields_ for k in fields_:
types_ = Result._types_ try:
for t in [CsvInt, CsvFloat, CsvFrac]:
for r in results:
if k in r and r[k].strip():
try:
t(r[k])
except ValueError:
break
else:
types_[k] = t
break
except AttributeError:
pass
# find best name for types
types__ = []
for k in fields_:
if k in types_:
t = types_[k].__name__
if t.startswith('Csv'):
t = t[len('Csv'):]
types__.append(t.lower())
else:
types__.append('?')
# find best name for types # find best name for types
types__ = [] types__ = []
@@ -2699,7 +2722,7 @@ def main(csv_paths, *,
# list computed? # list computed?
if args.get('list_computed'): if args.get('list_computed'):
return list_computed(Result, **args) return list_computed(fields_, results, Result, **args)
# homogenize # homogenize
results = homogenize(Result, results, results = homogenize(Result, results,