On Tue, Nov 7, 2017, at 07:22, Nick Coghlan wrote: > My suggestion for that definition is to have the *default* meaning of > "third party code" be "everything that isn't __main__".
What is __main__? Or, rather, how do you determine when it is to blame? For syntax it's easy, but any deprecated function necessarily belongs to its own module and not to main. Main may have called it, which can be detected from the stack trace, or it may have used it in some other way (pass to some builtin or e.g. itertools function that takes a callable argument, for example). Maybe the DeprecationWarning should be raised at the name lookup* rather than the call? What if "calling this function with some particular combination of arguments" is deprecated? *i.e. something like: class deprecated: def __init__(self, obj): self.obj = obj class DeprecatableModule(ModuleType): def __getattr__(self, name): obj = self.__dict__[name] if isinstance(type(obj), deprecated): if (detect somehow caller is __main__): raise DeprecationWarning return obj.obj else: return obj def __dir__(self): return [k for k in self.__dict__ if not isinstance(self.__dict__[k], deprecated)] sys.modules[__name__].type=DeprecatableModule @deprecated def some_deprecated_function(...): ... SOME_DEPRECATED_CONSTANT = deprecated(42) _______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com