tyro icon indicating copy to clipboard operation
tyro copied to clipboard

Mutable default arguments are double initialized

Open ElleryXii opened this issue 7 months ago • 3 comments

A minimum replicable example:


from dataclasses import dataclass, field
import tyro
import random

@dataclass
class TestDataclass:
    val: int = 1
    def __post_init__(self):
        self.val *= 2
        
def func1(data:TestDataclass=TestDataclass()):
    print(data.val)

if __name__ == "__main__":
    func1()  # prints 2
    tyro.cli(func1) # prints 4

When using tyro.cli, the __post_init__ function is called twice on the same data instance. This also happens to non-data class instances' __init__ functions.

tyro version: 0.8.5

ElleryXii avatar Jul 17 '24 20:07 ElleryXii