String Formatting Helpers

conduit.utils.format

String formatting in Python land has always been much more pleasant than in C++ land. In C++, we bundle fmt, but Python’s out-of-the box support for string formatting is fantastic. Since users may encode format string arguments in conduit Nodes (and in HDF5, YAML, etc files) we still provide access the fmt based conduit.utils.format functionality in Python.

conduit.utils.format(string, args)

The args case allows named arguments (args passed as object) or ordered args (args passed as list).

conduit.utils.format(string, args) – object case:

import conduit
import conduit.utils

args = conduit.Node()
args["answer"] = 42

print(conduit.utils.format("The answer is {answer:04}.", args = args))

args.reset()
args["adjective"] =  "other";
args["answer"] = 3.1415;

print(conduit.utils.format("The {adjective} answer is {answer:0.4f}.",
                           args = args))
 The answer is 0042.
 The other answer is 3.1415.

conduit.utils.format(string, args) – list case:

import conduit
import conduit.utils

args = conduit.Node()
args.append().set(42)

print(conduit.utils.format("The answer is {:04}.",args = args))

args.reset()
args.append().set("other")
args.append().set(3.1415)

print(conduit.utils.format("The {} answer is {:0.4f}.", args =args))
 The answer is 0042.
 The other answer is 3.1415.

conduit.utils.format(string, maps, map_index)

The maps case also supports named or ordered args and works in conjunction with a map_index. The map_index is used to fetch a value from an array, or list of strings, which is then passed to fmt. The maps style of indexed indirection supports generating path strings for non-trivial domain partition mappings in Blueprint.

conduit.utils.format(string, maps, map_index) – object case:

import conduit
import conduit.utils
import numpy as np

maps = conduit.Node()
maps["answer"].set(np.array([42.0, 3.1415]))

print(conduit.utils.format("The answer is {answer:04}.",
                            maps = maps, map_index = 0))

print(conduit.utils.format("The answer is {answer:04}.",
                            maps = maps, map_index = 1))
print()

maps.reset()
maps["answer"].set(np.array([42.0, 3.1415]));
slist = maps["position"];
slist.append().set("first")
slist.append().set("second")

print(conduit.utils.format("The {position} answer is {answer:0.4f}.",
                            maps = maps, map_index = 0))

print(conduit.utils.format("The {position} answer is {answer:0.4f}.",
                            maps = maps, map_index = 1))
 The answer is 0042.
 The answer is 3.1415.
 
 The first answer is 42.0000.
 The second answer is 3.1415.

conduit.utils.format(string, maps, map_index ) – list case:

import conduit
import conduit.utils
import numpy as np

maps = conduit.Node()
vals = np.array([42.0, 3.1415])
maps.append().set(vals)

print(conduit.utils.format("The answer is {}.",
                           maps = maps, map_index = 0))

print(conduit.utils.format("The answer is {}.",
                           maps = maps, map_index = 1))
print()

maps.reset()
# first arg
slist = maps.append();
slist.append().set("first")
slist.append().set("second")

# second arg
maps.append().set(vals)

print(conduit.utils.format("The {} answer is {:0.4f}.",
                           maps = maps, map_index = 0))

print(conduit.utils.format("The {} answer is {:0.4f}.",
                           maps = maps, map_index = 1))
 The answer is 42.
 The answer is 3.1415.
 
 The first answer is 42.0000.
 The second answer is 3.1415.