diff --git a/pymc/distributions/distribution.py b/pymc/distributions/distribution.py index 13cad0cf5d..e234760a56 100644 --- a/pymc/distributions/distribution.py +++ b/pymc/distributions/distribution.py @@ -577,6 +577,14 @@ def random(mu, rng=None, size=None): def __new__(cls, name, *args, **kwargs): kwargs.setdefault("class_name", name) + if isinstance(kwargs.get("observed", None), dict): + raise TypeError( + "Since ``v4.0.0`` the ``observed`` parameter should be of type" + " ``pd.Series``, ``np.array``, or ``pm.Data``." + " Previous versions allowed passing distribution parameters as" + " a dictionary in ``observed``, in the current version these " + "parameters are positional arguments." + ) return super().__new__(cls, name, *args, **kwargs) @classmethod diff --git a/pymc/tests/distributions/test_distribution.py b/pymc/tests/distributions/test_distribution.py index 73810f3fd9..ed0afeefe5 100644 --- a/pymc/tests/distributions/test_distribution.py +++ b/pymc/tests/distributions/test_distribution.py @@ -145,9 +145,29 @@ def test_density_dist_with_random(self, size): random=lambda mu, rng=None, size=None: rng.normal(loc=mu, scale=1, size=size), observed=np.random.randn(100, *size), ) - assert obs.eval().shape == (100,) + size + def test_density_dist_with_random_invalid_observed(self): + with pytest.raises( + TypeError, + match=( + "Since ``v4.0.0`` the ``observed`` parameter should be of type" + " ``pd.Series``, ``np.array``, or ``pm.Data``." + " Previous versions allowed passing distribution parameters as" + " a dictionary in ``observed``, in the current version these " + "parameters are positional arguments." + ), + ): + size = (3,) + with pm.Model() as model: + mu = pm.Normal("mu", 0, 1) + pm.DensityDist( + "density_dist", + mu, + random=lambda mu, rng=None, size=None: rng.normal(loc=mu, scale=1, size=size), + observed={"values": np.random.randn(100, *size)}, + ) + def test_density_dist_without_random(self): with pm.Model() as model: mu = pm.Normal("mu", 0, 1)