From 0a154847cec8e9a36040fbaf5b6902f6a945dfcd Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Wed, 25 Oct 2023 02:30:21 -0400 Subject: [PATCH] do not add type of default if it is already in type --- dargs/dargs.py | 15 ++++++++++++++- dargs/sphinx.py | 2 +- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/dargs/dargs.py b/dargs/dargs.py index dc70b0d..1506fd4 100644 --- a/dargs/dargs.py +++ b/dargs/dargs.py @@ -224,7 +224,7 @@ def _reorg_dtype(self): # check conner cases if self.sub_fields or self.sub_variants: self.dtype.add(list if self.repeat else dict) - if self.optional and self.default is not _Flags.NONE: + if self.optional and self.default is not _Flags.NONE and all([not isinstance_annotation(self.default, tt) for tt in self.dtype]): self.dtype.add(type(self.default)) # and make it compatible with `isinstance` self.dtype = tuple(self.dtype) @@ -968,6 +968,19 @@ def trim_by_pattern( argdict.pop(key) +def isinstance_annotation(value, dtype) -> bool: + """Same as isinstance(), but supports arbitrary type annotations.""" + try: + typeguard.check_type( + value, + dtype, + collection_check_strategy=typeguard.CollectionCheckStrategy.ALL_ITEMS, + ) + except typeguard.TypeCheckError as e: + return False + return True + + class ArgumentEncoder(json.JSONEncoder): """Extended JSON Encoder to encode Argument object: diff --git a/dargs/sphinx.py b/dargs/sphinx.py index 80a80e3..33f3371 100644 --- a/dargs/sphinx.py +++ b/dargs/sphinx.py @@ -192,5 +192,5 @@ def _test_arguments() -> List[Argument]: return [ Argument(name="test1", dtype=int, doc="Argument 1"), Argument(name="test2", dtype=[float, None], doc="Argument 2"), - Argument(name="test3", dtype=List[str], doc="Argument 3"), + Argument(name="test3", dtype=List[str], default=["test"], doc="Argument 3"), ]