[BUG] Documented signatures of `mx.add` and 27 other ops omit the keyword-only `*`, so `stream` (and `equal_nan`) cannot be passed positionally as documented

Aperta Adatta ai principianti
#4,814 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 2 giorni

@Redempt1onzzZZ ci sta già lavorando.

Dal 2/11/2026.

  • #4816 di @Redempt1onzzZZ — aperta

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
88/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
cpp, python

Direzione di ricerca

Leggi python/src/ops.cpp, concentrandoti sulle stringhe nb::sig("def ...") elencate e sui relativi binding nb::kw_only(). Aggiorna le firme in modo che la documentazione includa * prima di stream per le operazioni interessate e prima di equal_nan per array_equal. Verifica con il __doc__ di ogni operazione e con gli esempi di chiamate posizionali; il lavoro è completato quando le firme visualizzate corrispondono alle forme di chiamata accettate.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

☑️ I understand it is strictly prohibited to use AI to write issues.

Describe the bug
The signatures shown in the docs (and in __doc__) of several ops list stream as a regular positional parameter, e.g.
add(a: scalar | array, b: scalar | array, stream: StreamOrDevice = None) -> array.
The bindings declare nb::kw_only() before stream, so passing it positionally raises TypeError. The same signature string is printed in the TypeError message, so the error points to a call form that does not work. array_equal has the same problem for equal_nan.

To Reproduce

Include code snippet

import mlx.core as mx

a, b = mx.array([1, 2]), mx.array([3, 4])
print(mx.add.__doc__.splitlines()[0])

print(mx.add(a, b, stream=mx.cpu))   # works
mx.add(a, b, mx.cpu)                 # TypeError, although the signature above allows it

Output:

add(a: scalar | array, b: scalar | array, stream: StreamOrDevice = None) -> array
array([4, 6], dtype=int32)
TypeError: add(): incompatible function arguments. The following argument types are supported:
    1. add(a: scalar | array, b: scalar | array, stream: StreamOrDevice = None) -> array

Invoked with types: mlx.core.array, mlx.core.array, mlx.core.DeviceType

Same for equal_nan:

import mlx.core as mx
a, b = mx.array([1, 2]), mx.array([3, 4])
mx.array_equal(a, b, True)           # equal_nan passed positionally

Output:

TypeError: array_equal(): incompatible function arguments. The following argument types are supported:
    1. array_equal(a: scalar | array, b: scalar | array, equal_nan: bool = False, stream: StreamOrDevice = None) -> array

Invoked with types: mlx.core.array, mlx.core.array, bool

Expected behavior
The documented signature matches the binding, i.e. add(a, b, *, stream=None) (as already done for e.g. flatten, squeeze, expand_dims), or stream is accepted positionally.

Desktop (please complete the following information):

  • OS Version: macOS 26.6.2 (arm64)
  • Version: mlx 0.32.4

Additional context
The hand-written nb::sig("def ...") strings in python/src/ops.cpp lack the * for these 28 functions, while the bindings use nb::kw_only(): add, subtract, multiply, divide, divmod, floor_divide, remainder, equal, not_equal, less, less_equal, greater, greater_equal, array_equal, bitwise_and, bitwise_or, bitwise_xor, left_shift, right_shift, bitwise_invert, isnan, isinf, isfinite, isposinf, isneginf, round, view, hadamard_transform.

Each of them raises TypeError when stream (or equal_nan) is passed positionally. A similar mismatch between nb::sig and the binding was fixed in #3950 (cholesky_inv). Adding * before stream (before equal_nan for array_equal) in these strings should fix it; I can open a PR.

Lingua principale
C++
Stelle
29k
Fork
2.4k
Merge medio
3g 12h
PR unite (30g)
111

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di ml-explore/mlx

Tutte le issue di ml-explore/mlx

Issue simili

Altre issue su C++

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.