Skip to content

Commit 3c541ee

Browse files
generatedunixname647790274085263facebook-github-bot
generatedunixname647790274085263
authored andcommitted
[codemod][py3.12] Convert dataclasses mutable default values to use default_factory
Summary: As of [Python 3.11](https://docs.python.org/3.11/whatsnew/3.11.html#dataclasses), dataclasses now only allow defaults that are hashable. Using mutable (non-hashable) default values under Python 3.11+ will cause a runtime error: ``` ValueError: mutable default <class 'problematic.ClassName'> for field <field> is not allowed: use default_factory ``` This codemod attempts to automatically convert mutable defaults to use `default_factory` NOTE: The change is not semantically equivalent to before the change. Before, all dataclass instances with a mutable default value were sharing the same instance. This change results each dataclass instance using a new instance of the mutable value. It is likely that the before state was a latent bug, but it's still a behavior change! Reviewed By: itamaro Differential Revision: D70448655 fbshipit-source-id: 09b49467f1fe54f5ea9669de401f4f9cceadc06e
1 parent 223b137 commit 3c541ee

File tree

1 file changed

+9
-5
lines changed

1 file changed

+9
-5
lines changed

mmf/modules/encoders.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import re
77
from collections import OrderedDict
88
from copy import deepcopy
9-
from dataclasses import asdict, dataclass
9+
from dataclasses import asdict, dataclass, field
1010
from enum import Enum
1111
from typing import Any
1212

@@ -591,11 +591,15 @@ class MultiModalEncoderBase(Encoder):
591591
@dataclass
592592
class Config(Encoder.Config):
593593
# This actually is Union[ImageEncoderConfig, ImageFeatureEncoderConfig]
594-
modal_encoder: EncoderFactory.Config = ImageEncoderFactory.Config(
595-
type=ImageEncoderTypes.resnet152, params=ResNet152ImageEncoder.Config()
594+
modal_encoder: EncoderFactory.Config = field(
595+
default_factory=lambda: ImageEncoderFactory.Config(
596+
type=ImageEncoderTypes.resnet152, params=ResNet152ImageEncoder.Config()
597+
)
596598
)
597-
text_encoder: EncoderFactory.Config = TextEncoderFactory.Config(
598-
type=TextEncoderTypes.transformer, params=TransformerEncoder.Config()
599+
text_encoder: EncoderFactory.Config = field(
600+
default_factory=lambda: TextEncoderFactory.Config(
601+
type=TextEncoderTypes.transformer, params=TransformerEncoder.Config()
602+
)
599603
)
600604
direct_features_input: bool = False
601605
modal_hidden_size: int = 2048

0 commit comments

Comments
 (0)