diff options
author | alandonovan <adonovan@google.com> | 2018-02-26 17:11:13 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-02-26 17:11:13 -0500 |
commit | 653c157a7d1b331d43597e65b2f0e0c14286195d (patch) | |
tree | be1f0ca18f3536e562d2652569b9fe2f9efd63b4 | |
parent | 15b1cb9b233470f186d95baec2bb1d049432c73e (diff) | |
download | starlark-go-653c157a7d1b331d43597e65b2f0e0c14286195d.tar.gz |
getattr: return the default value if Attr returns an error (#72)
But return the original error if there was no default.
This is analogous to what #69 did for hasattr.
-rw-r--r-- | library.go | 16 |
1 files changed, 13 insertions, 3 deletions
@@ -516,10 +516,20 @@ func getattr(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, err if err := UnpackPositionalArgs("getattr", args, kwargs, 2, &object, &name, &dflt); err != nil { return nil, err } - if o, ok := object.(HasAttrs); ok { - if v, err := o.Attr(name); v != nil || err != nil { - return v, err + if object, ok := object.(HasAttrs); ok { + v, err := object.Attr(name) + if err != nil { + // An error could mean the field doesn't exist, + // or it exists but could not be computed. + if dflt != nil { + return dflt, nil + } + return nil, err + } + if v != nil { + return v, nil } + // (nil, nil) => no such field } if dflt != nil { return dflt, nil |