Completes #260 (which ships Constants.copy() and the DeprecationWarning in 1.4). In 2.0, explicit constants=None raises TypeError naming both replacements:
constants=Constants() for fresh library defaults
constants=CONSTANTS.copy() for a private snapshot of current shared config
It must raise, never be reinterpreted — silently flipping None to mean "shared" would invisibly change behavior for every existing caller.
Checklist
Completes #260 (which ships
Constants.copy()and theDeprecationWarningin 1.4). In 2.0, explicitconstants=NoneraisesTypeErrornaming both replacements:constants=Constants()for fresh library defaultsconstants=CONSTANTS.copy()for a private snapshot of current shared configIt must raise, never be reinterpreted — silently flipping
Noneto mean "shared" would invisibly change behavior for every existing caller.Checklist
NoneraisesTypeErrorwith the migration hintNone-constructs-Constants()branch from__init__; annotation narrows toconstants: Constants = CONSTANTS