Skip to content

Commit 8441b15

Browse files
authored
Merge pull request Pyomo#3722 from mrmundt/issue-3721
Bugfix: `ConfigDict.user_values()` should return only child entries, not instance itself
2 parents 12115ff + 965d430 commit 8441b15

2 files changed

Lines changed: 23 additions & 0 deletions

File tree

pyomo/common/config.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1600,7 +1600,12 @@ def __call__(
16001600

16011601
# ... and set the value, if appropriate
16021602
if value is not NOTSET:
1603+
# Note that because we are *creating* a new Config object,
1604+
# we do not want set_value() to change the current (default)
1605+
# userSet flag for this object/container (see #3721).
1606+
tmp = ans._userSet
16031607
ans.set_value(value)
1608+
ans._userSet = tmp
16041609
return ans
16051610

16061611
def name(self, fully_qualified=False):

pyomo/common/tests/test_config.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1599,6 +1599,24 @@ def test_UserValues_declare_subBlock(self):
15991599
test = '\n'.join(x.name(True) for x in self.config.user_values())
16001600
self.assertEqual(test, "")
16011601

1602+
def test_userValues_call_nonempty(self):
1603+
# See bug report in Pyomo/pyomo#3721
1604+
default = ConfigDict()
1605+
default.declare("filename", ConfigValue(default=None, domain=str))
1606+
cfg = default(value={"filename": "example.txt"})
1607+
names = [x.name(True) for x in cfg.user_values()]
1608+
self.assertEqual(names, ["filename"])
1609+
self.assertTrue(all(x is not cfg for x in cfg.user_values()))
1610+
1611+
def test_userValues_call_empty_then_set(self):
1612+
# See bug report in Pyomo/pyomo#3721
1613+
default = ConfigDict()
1614+
default.declare("filename", ConfigValue(default=None, domain=str))
1615+
cfg = default({})
1616+
cfg["filename"] = "example.txt"
1617+
names = [x.name(True) for x in cfg.user_values()]
1618+
self.assertEqual(names, ["filename"])
1619+
16021620
@unittest.skipIf(not yaml_available, "Test requires PyYAML")
16031621
def test_parseDisplayAndValue_default(self):
16041622
test = _display(self.config)

0 commit comments

Comments
 (0)