{"record":{"id":"0c2f196daef9658a","repo":"keras-team/keras","slug":"expected-an-integer-value-for-n-got-type-n","errorCode":null,"errorMessage":"Expected an integer value for `n`, got {type(n)}.","messagePattern":"Expected an integer value for `n`, got (.+?)\\.","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"keras/src/layers/reshaping/repeat_vector.py","lineNumber":31,"sourceCode":"    >>> x = keras.Input(shape=(32,))\n    >>> y = keras.layers.RepeatVector(3)(x)\n    >>> y.shape\n    (None, 3, 32)\n\n    Args:\n        n: Integer, repetition factor.\n\n    Input shape:\n        2D tensor with shape `(batch_size, features)`.\n\n    Output shape:\n        3D tensor with shape `(batch_size, n, features)`.\n    \"\"\"\n\n    def __init__(self, n, **kwargs):\n        super().__init__(**kwargs)\n        if not isinstance(n, int) or isinstance(n, bool):\n            raise TypeError(\n                f\"Expected an integer value for `n`, got {type(n)}.\"\n            )\n        if n <= 0:\n            raise ValueError(\n                f\"Argument `n` should be a positive integer. Received: n={n}\"\n            )\n        self.n = n\n        self.input_spec = InputSpec(ndim=2)\n\n    def compute_output_shape(self, input_shape):\n        return (input_shape[0], self.n, input_shape[1])\n\n    def call(self, inputs):\n        input_shape = ops.shape(inputs)\n        reshaped = ops.reshape(inputs, (input_shape[0], 1, input_shape[1]))\n        return ops.repeat(reshaped, self.n, axis=1)\n\n    def get_config(self):","sourceCodeStart":13,"sourceCodeEnd":49,"githubUrl":"https://github.com/keras-team/keras/blob/7a34a03db60bf60042242d6a556fc3be119046a5/keras/src/layers/reshaping/repeat_vector.py#L13-L49","documentation":"RepeatVector.__init__ requires n to be a genuine Python int. The explicit bool exclusion exists because isinstance(True, int) is True in Python, so True/False would otherwise silently become n=1/n=0. Floats, strings and None all fail this TypeError at construction.","triggerScenarios":"RepeatVector(n=3.0), RepeatVector(n='4'), RepeatVector(n=None), or RepeatVector(n=True). Any of these raises before the layer is usable.","commonSituations":"Reading n from JSON/YAML config where it deserializes as float or string; hyperparameter sweeps (optuna, ray) returning floats; forgetting to cast a CLI arg (always a string) to int.","solutions":["Cast explicitly: RepeatVector(n=int(n)) after confirming the value is integral","Fix the config source so n is stored and loaded as an integer (int() after JSON/YAML load, or a typed CLI flag)","If the value arrives as a numpy integer, wrap with int()"],"exampleFix":"# before\nn = float(cfg['repeat'])  # e.g. 4.0\nlayer = RepeatVector(n=n)  # TypeError\n\n# after\nn = int(cfg['repeat'])\nlayer = RepeatVector(n=n)","handlingStrategy":"type-guard","validationCode":"def coerce_n(n):\n    if isinstance(n, bool) or not isinstance(n, int):\n        raise TypeError(f'n must be int, got {type(n)}')\n    return n","typeGuard":"def is_strict_int(v) -> bool:\n    return isinstance(v, int) and not isinstance(v, bool)","tryCatchPattern":null,"preventionTips":["Cast config values with int() at load time","Treat bool as invalid for count-like parameters","Schema-validate config files so n is typed int"],"tags":["keras","repeat-vector","type-validation","argument-validation"],"backgroundTag":"wrong-argument-type","analyzedSha":"7a34a03db60bf60042242d6a556fc3be119046a5","analyzedAt":"2026-08-25T21:25:25.994Z","schemaVersion":2},"datasetVersion":"2026-08-26T02:17:13.382Z"}