#2564 dict exists throws unexpected error

obsolete: 8.5a0

The dict exists subcommand shows a behaviour that is
not clearly documented but unexpected, so either this
is a documentation bug or a misfeature/real bug.

I tried to update msgcat.tcl to dicts and stumbled
accross the following:

set Msgs [dict create]
# create a subdict for a locale
dict set Msgs de [dict create]
# create a subdict for a namespace
dict set Msgs de "" [dict create]
# create an entry there
dict set Msgs de "" hello Hallo

# check if a translation exists
dict exists $Msgs fr "" hello

This throws an error if the subdict fr and fr "" does
not exist. I would expect it to simply return 0.

It would be better if it simply returned 0, as there is
no good (and fast) workaround.

The only alternatives are:

set ok 0
set path ""
foreach key {fr "" hello} {
lappend path $key
if {[dict exists $Msgs {expand}$path]} {
set ok 1
} else {


if {[catch {dict exists $Msgs fr "" hello} val]} { ... }

As i think a check for element existance is a common
operation it should not need such complex workarounds
to be useful for nested dicts.

The current behaviour would be more appropriate for
something like a dict exists -strict command variant.



  • Logged In: YES

    Hmm. Is it a bug or a misfeature? I've a test (dict-9.5)
    checking for exactly this behaviour...

    Review of documentation indicates bug. :^/

  • Logged In: YES

    I attach the patch I used to fix the fault.

    • status: open --> closed-fixed
  • unidiff vs. HEAD