call_extra() drops arguments for partial callbacks

Aperta
#817 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@HocVoNgThai ci sta già lavorando.

Dal 1/11/2026.

  • #818 di @HocVoNgThai — aperta

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
65/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
python
Ambito
devtools

Direzione di ricerca

Start with the reproducer in the issue, which uses HookCaller.call_extra() with a functools.partial callback. The problem is in varnames(), which reads the partial's own __call__ instead of its remaining signature, so the bound arguments are never forwarded. Run the snippet and confirm it returns [("demo", 7)], then check the existing varnames() tests for plain functions and partials.

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

Descrizione

Passing a functools.partial callback to HookCaller.call_extra() drops the remaining hook arguments. A callback with a required argument raises TypeError; one with a default silently uses that default instead of the supplied value.

from functools import partial
import pluggy

hookspec = pluggy.HookspecMarker("example")

class Hooks:
    @hookspec
    def event(self, value):
        pass

def on_event(context, value):
    return context, value

pm = pluggy.PluginManager("example")
pm.add_hookspecs(Hooks)
callback = partial(on_event, "demo")
assert callback(7) == ("demo", 7)
print(pm.hook.event.call_extra([callback], {"value": 7}))

Expected: [("demo", 7)].
Actual: TypeError: on_event() missing 1 required positional argument: 'value'.

varnames() inspects the partial's built-in __call__ rather than its remaining signature, so no parameters are forwarded.

Reproduced on Python 3.12.16/Linux with main 3fc9e561ea7e72a95549673d79ebdaf4a9fae829.

Lingua principale
Python
Stelle
1.7k
Fork
200
Merge medio
10h 4m
PR unite (30g)
13

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

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 pytest-dev/pluggy

Tutte le issue di pytest-dev/pluggy

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.