From fb17c2965ee21c2e692ef501ea81994e9c489666 Mon Sep 17 00:00:00 2001 From: Edward Loper Date: Thu, 15 Sep 2022 19:39:36 -0700 Subject: [PATCH] Update code that uses Fiddle to use fdl.cast and fdl.with_update rather than the deprecated "copy constructor." PiperOrigin-RevId: 474712700 --- fiddle/config.py | 13 ++----------- fiddle/experimental/autobuilders/__init__.py | 1 + fiddle/experimental/autobuilders/autobuilders.py | 8 ++++++++ fiddle/experimental/yaml_serialization_test.py | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/fiddle/config.py b/fiddle/config.py index 872fdd1a..92019844 100644 --- a/fiddle/config.py +++ b/fiddle/config.py @@ -95,17 +95,11 @@ def __init__(self, fn_or_cls: Union['Buildable', TypeOrCallableProducingT], /, **kwargs: Any keyword arguments to configure for `fn_or_cls`. """ if isinstance(fn_or_cls, Buildable): - # TODO Turn this into a ValueError once code that uses this - # pattern has been updated to use fdl.cast or fdl.copy_with. - logging.warning( + raise ValueError( 'Using the Buildable constructor to convert a buildable to a new ' 'type or to override arguments is deprecated; please use either ' '`fdl.cast(new_type, buildable)` (for casting) or ' '`fdl.copy_with(buildable, **kwargs)` (for overriding arguments).') - copy_constructor_arguments = fn_or_cls.__arguments__ - fn_or_cls = fn_or_cls.__fn_or_cls__ - else: - copy_constructor_arguments = None # Using `super().__setattr__` here because assigning directly would trigger # our `__setattr__` override. Using `super().__setattr__` instead of special @@ -134,10 +128,6 @@ def __init__(self, fn_or_cls: Union['Buildable', TypeOrCallableProducingT], /, elif param.kind == param.VAR_KEYWORD: arguments.update(arguments.pop(param.name)) - if copy_constructor_arguments: - for name, value in copy_constructor_arguments.items(): - arguments.setdefault(name, value) - if hasattr(fn_or_cls, '__fiddle_init__'): fn_or_cls.__fiddle_init__(self) @@ -709,6 +699,7 @@ def get_tags(buildable: Buildable, _SUPPORTED_CASTS = set() + BuildableT = TypeVar('BuildableT', bound=Buildable) diff --git a/fiddle/experimental/autobuilders/__init__.py b/fiddle/experimental/autobuilders/__init__.py index 2aa870b3..fe3a5260 100644 --- a/fiddle/experimental/autobuilders/__init__.py +++ b/fiddle/experimental/autobuilders/__init__.py @@ -17,6 +17,7 @@ from fiddle.experimental.autobuilders.autobuilders import auto_skeleton from fiddle.experimental.autobuilders.autobuilders import config +from fiddle.experimental.autobuilders.autobuilders import partial from fiddle.experimental.autobuilders.autobuilders import Registry from fiddle.experimental.autobuilders.autobuilders import skeleton from fiddle.experimental.autobuilders.autobuilders import validator diff --git a/fiddle/experimental/autobuilders/autobuilders.py b/fiddle/experimental/autobuilders/autobuilders.py index f6ebc3a6..5fd3f880 100644 --- a/fiddle/experimental/autobuilders/autobuilders.py +++ b/fiddle/experimental/autobuilders/autobuilders.py @@ -182,6 +182,13 @@ def config(self, entry.skeleton_fn(base_config) return base_config + def partial(self, + fn_or_cls: FnOrCls[T], + require_skeleton: bool = True) -> config_lib.Partial[T]: + """Creates a fdl.Partial instance of a given function or class.""" + return config_lib.cast(config_lib.Partial, + self.config(fn_or_cls, require_skeleton)) + def skeleton( self, fn_or_cls: FnOrCls[T]) -> Callable[[SkeletonFn[T]], SkeletonFn[T]]: """Registers a function as a skeleton for a given type. @@ -318,6 +325,7 @@ def inner(validator_fn: ValidatorFn[T]) -> ValidatorFn[T]: # module level. _default_registry = Registry() config = _default_registry.config +partial = _default_registry.partial skeleton = _default_registry.skeleton auto_skeleton = _default_registry.auto_skeleton validator = _default_registry.validator diff --git a/fiddle/experimental/yaml_serialization_test.py b/fiddle/experimental/yaml_serialization_test.py index 3e89ee1d..eb5be967 100644 --- a/fiddle/experimental/yaml_serialization_test.py +++ b/fiddle/experimental/yaml_serialization_test.py @@ -44,11 +44,11 @@ def _config_constructor(loader, node): def _partial_constructor(loader, node): - return fdl.Partial(_config_constructor(loader, node)) + return fdl.cast(fdl.Partial, _config_constructor(loader, node)) def _fixture_constructor(loader, node): - return fixture_node.FixtureNode(_config_constructor(loader, node)) + return fdl.cast(fixture_node.FixtureNode, _config_constructor(loader, node)) class SemiSafeLoader(yaml.SafeLoader):