From 3f657ed3a1f7844b3629de018ab3fb6351971590 Mon Sep 17 00:00:00 2001 From: svlandeg Date: Sat, 3 Oct 2020 22:34:10 +0200 Subject: [PATCH] implement warning in __init_subclass__ instead --- spacy/errors.py | 6 +++--- spacy/language.py | 6 +----- spacy/pipeline/pipe.pyx | 10 +++++++++- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/spacy/errors.py b/spacy/errors.py index 2c076db52..791e567eb 100644 --- a/spacy/errors.py +++ b/spacy/errors.py @@ -85,9 +85,9 @@ class Warnings: "attribute or operator.") # TODO: fix numbering after merging develop into master - W089 = ("The 'begin_training' method has been renamed to 'initialize', " - "for calls to 'nlp' as well as for the individual pipeline " - "components.") + W088 = ("This component implements a 'begin_training' method, " + "which should probably be renamed to 'initialize'.") + W089 = ("The nlp.begin_training method has been renamed to nlp.initialize.") W090 = ("Could not locate any {format} files in path '{path}'.") W091 = ("Could not clean/remove the temp directory at {dir}: {msg}.") W092 = ("Ignoring annotations for sentence starts, as dependency heads are set.") diff --git a/spacy/language.py b/spacy/language.py index 36cd251f3..14b9f4eb0 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -1207,11 +1207,7 @@ class Language: ) self.tokenizer.initialize(get_examples, nlp=self, **tok_settings) for name, proc in self.pipeline: - # backwards compatibility for older components - if hasattr(proc, "begin_training"): - warnings.warn(Warnings.W089, DeprecationWarning) - proc.begin_training(get_examples, pipeline=self.pipeline, sgd=self._optimizer) - elif hasattr(proc, "initialize"): + if hasattr(proc, "initialize"): p_settings = I["components"].get(name, {}) p_settings = validate_init_settings( proc.initialize, p_settings, section="components", name=name diff --git a/spacy/pipeline/pipe.pyx b/spacy/pipeline/pipe.pyx index 5316620e9..a18f04ee3 100644 --- a/spacy/pipeline/pipe.pyx +++ b/spacy/pipeline/pipe.pyx @@ -1,4 +1,5 @@ # cython: infer_types=True, profile=True +import warnings from typing import Optional, Tuple import srsly from thinc.api import set_dropout_rate, Model @@ -6,7 +7,7 @@ from thinc.api import set_dropout_rate, Model from ..tokens.doc cimport Doc from ..training import validate_examples -from ..errors import Errors +from ..errors import Errors, Warnings from .. import util @@ -33,6 +34,13 @@ cdef class Pipe: self.name = name self.cfg = dict(cfg) + @classmethod + def __init_subclass__(cls, **kwargs): + """Raise a warning if an inheriting class implements 'begin_training' + (from v2) instead of the new 'initialize' method (from v3)""" + if hasattr(cls, "begin_training"): + warnings.warn(Warnings.W088) + @property def labels(self) -> Optional[Tuple[str]]: return []