def test_name_type(self): # naive ca = Argument("key1", int) ca.check({"key1": 10}) # accept multiple types ca = Argument("key1", [int, list, str]) ca.check({"key1": 10}) ca.check({"key1": [10, 20]}) ca.check({"key1": "hello"}) # possible error with self.assertRaises(ArgumentKeyError): ca.check({"key2": 1}) with self.assertRaises(ArgumentKeyError): ca.check({"key1": 1, "key2": 1}, strict=True) with self.assertRaises(ArgumentTypeError): ca.check({"key1": 1.0}) # special handle of None ca = Argument("key1", [int, None]) ca.check({"key1": None}) # optional case ca = Argument("key1", int, optional=True) ca.check({}) # extra checker ca = Argument("key1", int, extra_check=lambda v: v > 0) ca.check({"key1": 1}) with self.assertRaises(ArgumentValueError): ca.check({"key1": 0}) # check any keywords ca = Argument("kwargs", dict) anydict = {"this": 1, "that": 2, "any": 3} ca.check({"kwargs": anydict}, strict=True) ca.check_value(anydict)
def check(data): ma = model_args() lra = learning_rate_args() la = loss_args() ta = training_args() base = Argument("base", dict, [ma, lra, la, ta]) base.check_value(data)
def test_sub_fields(self): ca = Argument("base", dict, [ Argument("sub1", int), Argument("sub2", [str, dict], [ Argument("subsub1", int), Argument("subsub2", dict, [Argument("subsubsub1", int)]) ]) ]) # short one test_dict1 = {"base": {"sub1": 1, "sub2": "hello"}} self.assertSetEqual(set(ca.flatten_sub(test_dict1["base"]).keys()), set(test_dict1["base"].keys())) ca.check(test_dict1) ca.check_value(test_dict1["base"]) # long one test_dict2 = { "base": { "sub1": 1, "sub2": { "subsub1": 11, "subsub2": { "subsubsub1": 111 } } } } ca.check(test_dict2) ca.check_value(test_dict2["base"]) # expect error err_dict1 = { "base": { "sub1": 1, "sub2": { "subsub1": 11, "subsub2": { "subsubsub2": 111 } } } } # different name here with self.assertRaises(ArgumentKeyError): ca.check(err_dict1) err_dict1["base"]["sub2"]["subsub2"]["subsubsub1"] = 111 ca.check(err_dict1) # now should pass with self.assertRaises(ArgumentKeyError): ca.check(err_dict1, strict=True) # but should fail when strict err_dict1["base"]["sub2"] = None with self.assertRaises(ArgumentTypeError): ca.check(err_dict1) # make sure no dup keys is allowed with self.assertRaises(ValueError): Argument("base", dict, [Argument("sub1", int), Argument("sub1", int)])
def normalize(data): ma = model_args() lra = learning_rate_args() la = loss_args() ta = training_args() base = Argument("base", dict, [ma, lra, la, ta]) data = base.normalize_value(data, trim_pattern="_*") base.check_value(data) return data
def test_sub_repeat(self): ca = Argument("base", dict, [Argument("sub1", int), Argument("sub2", str)], repeat=True) test_dict1 = { "base": [{ "sub1": 10, "sub2": "hello" }, { "sub1": 11, "sub2": "world" }] } ca.check(test_dict1) ca.check_value(test_dict1["base"]) err_dict1 = { "base": [{ "sub1": 10, "sub2": "hello" }, { "sub1": 11, "sub3": "world" }] } with self.assertRaises(ArgumentKeyError): ca.check(err_dict1) err_dict1["base"][1]["sub2"] = "world too" ca.check(err_dict1) # now should pass with self.assertRaises(ArgumentKeyError): ca.check(err_dict1, strict=True) # but should fail when strict err_dict2 = { "base": [{ "sub1": 10, "sub2": "hello" }, { "sub1": 11, "sub2": None }] } with self.assertRaises(ArgumentTypeError): ca.check(err_dict2)