diff --git a/proto/message.py b/proto/message.py index 7293fdb5..de9280da 100644 --- a/proto/message.py +++ b/proto/message.py @@ -274,25 +274,28 @@ def meta(cls): return cls._meta def __dir__(self): - names = set(dir(type)) - names.update( - ( - "meta", - "pb", - "wrap", - "serialize", - "deserialize", - "to_json", - "from_json", - "to_dict", - "copy_from", + try: + names = set(dir(type)) + names.update( + ( + "meta", + "pb", + "wrap", + "serialize", + "deserialize", + "to_json", + "from_json", + "to_dict", + "copy_from", + ) ) - ) - desc = self.pb().DESCRIPTOR - names.update(t.name for t in desc.nested_types) - names.update(e.name for e in desc.enum_types) + desc = self.pb().DESCRIPTOR + names.update(t.name for t in desc.nested_types) + names.update(e.name for e in desc.enum_types) - return names + return names + except AttributeError: + return dir(type) def pb(cls, obj=None, *, coerce: bool = False): """Return the underlying protobuf Message class or instance. diff --git a/tests/test_message.py b/tests/test_message.py index 843fad22..3146f0bb 100644 --- a/tests/test_message.py +++ b/tests/test_message.py @@ -415,3 +415,7 @@ class Arm(proto.Message): actual = set(dir(Mollusc)) assert actual == expected + + +def test_dir_message_base(): + assert set(dir(proto.Message)) == set(dir(type))