mirror of
https://github.com/zebrajr/pytorch.git
synced 2025-12-06 12:20:52 +01:00
Summary: Generally wildcard imports are bad for the reasons described here: https://www.flake8rules.com/rules/F403.html This PR replaces wildcard imports with an explicit list of imported items where possible, and adds a `# noqa: F403` comment in the other cases (mostly re-exports in `__init__.py` files). This is a prerequisite for https://github.com/pytorch/pytorch/issues/55816, because currently [`tools/codegen/dest/register_dispatch_key.py` simply fails if you sort its imports](https://github.com/pytorch/pytorch/actions/runs/742505908). Pull Request resolved: https://github.com/pytorch/pytorch/pull/55838 Test Plan: CI. You can also run `flake8` locally. Reviewed By: jbschlosser Differential Revision: D27724232 Pulled By: samestep fbshipit-source-id: 269fb09cb4168f8a51fd65bfaacc6cda7fb87c34
45 lines
1.7 KiB
Python
45 lines
1.7 KiB
Python
from tools.codegen.utils import S, T, context
|
|
from tools.codegen.model import NativeFunction, NativeFunctionsGroup
|
|
import tools.codegen.local as local
|
|
|
|
import functools
|
|
from typing import TypeVar, Union, Iterator, Callable
|
|
import contextlib
|
|
|
|
# Helper functions for defining generators on things in the model
|
|
|
|
F = TypeVar('F', NativeFunction, NativeFunctionsGroup, Union[NativeFunction, NativeFunctionsGroup])
|
|
|
|
@contextlib.contextmanager
|
|
def native_function_manager(g: Union[NativeFunctionsGroup, NativeFunction]) -> Iterator[None]:
|
|
if isinstance(g, NativeFunctionsGroup):
|
|
# By default, we associate all errors with structured native functions
|
|
# with the out variant. In some cases, it might be better to have
|
|
# a more specific place to hang things; if so, use
|
|
# native_function_manager again on the inside
|
|
f = g.out
|
|
else:
|
|
f = g
|
|
with context(f'in {f.loc}:\n {f.func}'):
|
|
with local.parametrize():
|
|
yield
|
|
|
|
# Given a function that operates on NativeFunction, wrap it into a new function
|
|
# that sets some appropriate context managers for that native function.
|
|
# YOU MUST WRAP FUNCTIONS IN THIS for calls to api modules to be sound
|
|
# (you will get an error if we try to access the local variables without having
|
|
# set them).
|
|
def with_native_function(func: Callable[[F], T]) -> Callable[[F], T]:
|
|
@functools.wraps(func)
|
|
def wrapper(f: F) -> T:
|
|
with native_function_manager(f):
|
|
return func(f)
|
|
return wrapper
|
|
|
|
def method_with_native_function(func: Callable[[S, F], T]) -> Callable[[S, F], T]:
|
|
@functools.wraps(func)
|
|
def wrapper(slf: S, f: F) -> T:
|
|
with native_function_manager(f):
|
|
return func(slf, f)
|
|
return wrapper
|