diff --git a/hgext/convert/cvs.py b/hgext/convert/cvs.py
--- a/hgext/convert/cvs.py
+++ b/hgext/convert/cvs.py
@@ -12,7 +12,6 @@ import socket
 
 from mercurial.i18n import _
 from mercurial.pycompat import (
-    getattr,
     open,
 )
 from mercurial import (
diff --git a/hgext/convert/transport.py b/hgext/convert/transport.py
--- a/hgext/convert/transport.py
+++ b/hgext/convert/transport.py
@@ -27,8 +27,6 @@ import svn.ra
 Pool = svn.core.Pool
 SubversionException = svn.core.SubversionException
 
-from mercurial.pycompat import getattr
-
 # Some older versions of the Python bindings need to be
 # explicitly initialized. But what we want to do probably
 # won't work worth a darn against those libraries anyway!
diff --git a/hgext/factotum.py b/hgext/factotum.py
--- a/hgext/factotum.py
+++ b/hgext/factotum.py
@@ -48,7 +48,6 @@ service entry controls the service name 
 
 import os
 from mercurial.i18n import _
-from mercurial.pycompat import setattr
 from mercurial.utils import procutil
 from mercurial import (
     error,
diff --git a/hgext/fastannotate/context.py b/hgext/fastannotate/context.py
--- a/hgext/fastannotate/context.py
+++ b/hgext/fastannotate/context.py
@@ -12,9 +12,7 @@ import os
 
 from mercurial.i18n import _
 from mercurial.pycompat import (
-    getattr,
     open,
-    setattr,
 )
 from mercurial.node import (
     bin,
diff --git a/hgext/fastannotate/support.py b/hgext/fastannotate/support.py
--- a/hgext/fastannotate/support.py
+++ b/hgext/fastannotate/support.py
@@ -6,7 +6,6 @@
 # GNU General Public License version 2 or any later version.
 
 
-from mercurial.pycompat import getattr
 from mercurial import (
     context as hgcontext,
     dagop,
diff --git a/hgext/histedit.py b/hgext/histedit.py
--- a/hgext/histedit.py
+++ b/hgext/histedit.py
@@ -207,7 +207,6 @@ import struct
 
 from mercurial.i18n import _
 from mercurial.pycompat import (
-    getattr,
     open,
 )
 from mercurial.node import (
diff --git a/hgext/keyword.py b/hgext/keyword.py
--- a/hgext/keyword.py
+++ b/hgext/keyword.py
@@ -88,7 +88,6 @@ import re
 import weakref
 
 from mercurial.i18n import _
-from mercurial.pycompat import getattr
 from mercurial.hgweb import webcommands
 
 from mercurial import (
diff --git a/hgext/largefiles/storefactory.py b/hgext/largefiles/storefactory.py
--- a/hgext/largefiles/storefactory.py
+++ b/hgext/largefiles/storefactory.py
@@ -5,7 +5,6 @@
 import re
 
 from mercurial.i18n import _
-from mercurial.pycompat import getattr
 from mercurial import (
     error,
     hg,
diff --git a/hgext/lfs/blobstore.py b/hgext/lfs/blobstore.py
--- a/hgext/lfs/blobstore.py
+++ b/hgext/lfs/blobstore.py
@@ -15,7 +15,6 @@ import re
 import socket
 
 from mercurial.i18n import _
-from mercurial.pycompat import getattr
 from mercurial.node import hex
 
 from mercurial import (
diff --git a/hgext/lfs/wrapper.py b/hgext/lfs/wrapper.py
--- a/hgext/lfs/wrapper.py
+++ b/hgext/lfs/wrapper.py
@@ -10,10 +10,6 @@ import hashlib
 
 from mercurial.i18n import _
 from mercurial.node import bin, hex, short
-from mercurial.pycompat import (
-    getattr,
-    setattr,
-)
 
 from mercurial import (
     bundle2,
diff --git a/hgext/mq.py b/hgext/mq.py
--- a/hgext/mq.py
+++ b/hgext/mq.py
@@ -75,8 +75,6 @@ from mercurial.node import (
     short,
 )
 from mercurial.pycompat import (
-    delattr,
-    getattr,
     open,
 )
 from mercurial import (
diff --git a/hgext/phabricator.py b/hgext/phabricator.py
--- a/hgext/phabricator.py
+++ b/hgext/phabricator.py
@@ -71,7 +71,6 @@ import time
 
 from mercurial.node import bin, short
 from mercurial.i18n import _
-from mercurial.pycompat import getattr
 from mercurial.thirdparty import attr
 from mercurial import (
     cmdutil,
diff --git a/hgext/remotefilelog/basepack.py b/hgext/remotefilelog/basepack.py
--- a/hgext/remotefilelog/basepack.py
+++ b/hgext/remotefilelog/basepack.py
@@ -7,7 +7,6 @@ import time
 
 from mercurial.i18n import _
 from mercurial.pycompat import (
-    getattr,
     open,
 )
 from mercurial.node import hex
diff --git a/hgext/remotefilelog/contentstore.py b/hgext/remotefilelog/contentstore.py
--- a/hgext/remotefilelog/contentstore.py
+++ b/hgext/remotefilelog/contentstore.py
@@ -4,7 +4,6 @@ from mercurial.node import (
     hex,
     sha1nodeconstants,
 )
-from mercurial.pycompat import getattr
 from mercurial import (
     mdiff,
     revlog,
diff --git a/hgext/sparse.py b/hgext/sparse.py
--- a/hgext/sparse.py
+++ b/hgext/sparse.py
@@ -73,7 +73,6 @@ certain files::
 
 
 from mercurial.i18n import _
-from mercurial.pycompat import setattr
 from mercurial import (
     cmdutil,
     commands,
diff --git a/hgext/win32mbcs.py b/hgext/win32mbcs.py
--- a/hgext/win32mbcs.py
+++ b/hgext/win32mbcs.py
@@ -49,7 +49,6 @@ import os
 import sys
 
 from mercurial.i18n import _
-from mercurial.pycompat import getattr, setattr
 from mercurial import (
     encoding,
     error,
diff --git a/mercurial/bookmarks.py b/mercurial/bookmarks.py
--- a/mercurial/bookmarks.py
+++ b/mercurial/bookmarks.py
@@ -14,7 +14,6 @@ from .node import (
     hex,
     short,
 )
-from .pycompat import getattr
 from . import (
     encoding,
     error,
diff --git a/mercurial/chgserver.py b/mercurial/chgserver.py
--- a/mercurial/chgserver.py
+++ b/mercurial/chgserver.py
@@ -49,10 +49,6 @@ import struct
 import time
 
 from .i18n import _
-from .pycompat import (
-    getattr,
-    setattr,
-)
 from .node import hex
 
 from . import (
diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
--- a/mercurial/cmdutil.py
+++ b/mercurial/cmdutil.py
@@ -28,9 +28,7 @@ from .node import (
     short,
 )
 from .pycompat import (
-    getattr,
     open,
-    setattr,
 )
 from .thirdparty import attr
 
diff --git a/mercurial/color.py b/mercurial/color.py
--- a/mercurial/color.py
+++ b/mercurial/color.py
@@ -9,7 +9,6 @@
 import re
 
 from .i18n import _
-from .pycompat import getattr
 
 from . import (
     encoding,
diff --git a/mercurial/commandserver.py b/mercurial/commandserver.py
--- a/mercurial/commandserver.py
+++ b/mercurial/commandserver.py
@@ -16,7 +16,6 @@ import struct
 import traceback
 
 from .i18n import _
-from .pycompat import getattr
 from . import (
     encoding,
     error,
diff --git a/mercurial/config.py b/mercurial/config.py
--- a/mercurial/config.py
+++ b/mercurial/config.py
@@ -10,7 +10,6 @@ import errno
 import os
 
 from .i18n import _
-from .pycompat import getattr
 from . import (
     encoding,
     error,
diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -16,9 +16,6 @@ from .node import (
     nullrev,
     short,
 )
-from .pycompat import (
-    getattr,
-)
 from . import (
     dagop,
     encoding,
diff --git a/mercurial/crecord.py b/mercurial/crecord.py
--- a/mercurial/crecord.py
+++ b/mercurial/crecord.py
@@ -15,7 +15,6 @@ import signal
 
 from .i18n import _
 from .pycompat import (
-    getattr,
     open,
 )
 from . import (
diff --git a/mercurial/debugcommands.py b/mercurial/debugcommands.py
--- a/mercurial/debugcommands.py
+++ b/mercurial/debugcommands.py
@@ -33,7 +33,6 @@ from .node import (
     short,
 )
 from .pycompat import (
-    getattr,
     open,
 )
 from . import (
diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py
--- a/mercurial/dirstate.py
+++ b/mercurial/dirstate.py
@@ -13,7 +13,6 @@ import stat
 import uuid
 
 from .i18n import _
-from .pycompat import delattr
 
 from hgdemandimport import tracing
 
diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py
--- a/mercurial/dispatch.py
+++ b/mercurial/dispatch.py
@@ -18,7 +18,6 @@ import traceback
 
 
 from .i18n import _
-from .pycompat import getattr
 
 from hgdemandimport import tracing
 
diff --git a/mercurial/encoding.py b/mercurial/encoding.py
--- a/mercurial/encoding.py
+++ b/mercurial/encoding.py
@@ -11,7 +11,6 @@ import os
 import re
 import unicodedata
 
-from .pycompat import getattr
 from . import (
     error,
     policy,
diff --git a/mercurial/extensions.py b/mercurial/extensions.py
--- a/mercurial/extensions.py
+++ b/mercurial/extensions.py
@@ -19,9 +19,7 @@ from .i18n import (
     gettext,
 )
 from .pycompat import (
-    getattr,
     open,
-    setattr,
 )
 
 from . import (
diff --git a/mercurial/filemerge.py b/mercurial/filemerge.py
--- a/mercurial/filemerge.py
+++ b/mercurial/filemerge.py
@@ -16,9 +16,6 @@ from .node import (
     hex,
     short,
 )
-from .pycompat import (
-    getattr,
-)
 
 from . import (
     encoding,
diff --git a/mercurial/fileset.py b/mercurial/fileset.py
--- a/mercurial/fileset.py
+++ b/mercurial/fileset.py
@@ -9,7 +9,6 @@
 import re
 
 from .i18n import _
-from .pycompat import getattr
 from . import (
     error,
     filesetlang,
diff --git a/mercurial/filesetlang.py b/mercurial/filesetlang.py
--- a/mercurial/filesetlang.py
+++ b/mercurial/filesetlang.py
@@ -7,7 +7,6 @@
 
 
 from .i18n import _
-from .pycompat import getattr
 from . import (
     error,
     parser,
diff --git a/mercurial/help.py b/mercurial/help.py
--- a/mercurial/help.py
+++ b/mercurial/help.py
@@ -26,7 +26,6 @@ from .i18n import (
     _,
     gettext,
 )
-from .pycompat import getattr
 from . import (
     cmdutil,
     encoding,
diff --git a/mercurial/hg.py b/mercurial/hg.py
--- a/mercurial/hg.py
+++ b/mercurial/hg.py
@@ -19,7 +19,6 @@ from .node import (
     sha1nodeconstants,
     short,
 )
-from .pycompat import getattr
 
 from . import (
     bookmarks,
diff --git a/mercurial/hgweb/common.py b/mercurial/hgweb/common.py
--- a/mercurial/hgweb/common.py
+++ b/mercurial/hgweb/common.py
@@ -15,7 +15,6 @@ import stat
 
 from ..i18n import _
 from ..pycompat import (
-    getattr,
     open,
 )
 from .. import (
diff --git a/mercurial/hgweb/hgweb_mod.py b/mercurial/hgweb/hgweb_mod.py
--- a/mercurial/hgweb/hgweb_mod.py
+++ b/mercurial/hgweb/hgweb_mod.py
@@ -17,7 +17,6 @@ from .common import (
     permhooks,
     statusmessage,
 )
-from ..pycompat import getattr
 
 from .. import (
     encoding,
diff --git a/mercurial/hgweb/server.py b/mercurial/hgweb/server.py
--- a/mercurial/hgweb/server.py
+++ b/mercurial/hgweb/server.py
@@ -16,7 +16,6 @@ import wsgiref.validate
 
 from ..i18n import _
 from ..pycompat import (
-    getattr,
     open,
 )
 
diff --git a/mercurial/hgweb/webcommands.py b/mercurial/hgweb/webcommands.py
--- a/mercurial/hgweb/webcommands.py
+++ b/mercurial/hgweb/webcommands.py
@@ -13,7 +13,6 @@ import re
 
 from ..i18n import _
 from ..node import hex, short
-from ..pycompat import getattr
 
 from .common import (
     ErrorResponse,
diff --git a/mercurial/hgweb/webutil.py b/mercurial/hgweb/webutil.py
--- a/mercurial/hgweb/webutil.py
+++ b/mercurial/hgweb/webutil.py
@@ -14,7 +14,6 @@ import re
 
 from ..i18n import _
 from ..node import hex, short
-from ..pycompat import setattr
 
 from .common import (
     ErrorResponse,
diff --git a/mercurial/hgweb/wsgicgi.py b/mercurial/hgweb/wsgicgi.py
--- a/mercurial/hgweb/wsgicgi.py
+++ b/mercurial/hgweb/wsgicgi.py
@@ -11,7 +11,6 @@
 
 import os
 
-from ..pycompat import getattr
 from .. import pycompat
 
 from ..utils import procutil
diff --git a/mercurial/hook.py b/mercurial/hook.py
--- a/mercurial/hook.py
+++ b/mercurial/hook.py
@@ -12,7 +12,6 @@ import os
 import sys
 
 from .i18n import _
-from .pycompat import getattr
 from . import (
     demandimport,
     encoding,
diff --git a/mercurial/httppeer.py b/mercurial/httppeer.py
--- a/mercurial/httppeer.py
+++ b/mercurial/httppeer.py
@@ -15,7 +15,6 @@ import struct
 
 from concurrent import futures
 from .i18n import _
-from .pycompat import getattr
 from . import (
     bundle2,
     error,
diff --git a/mercurial/i18n.py b/mercurial/i18n.py
--- a/mercurial/i18n.py
+++ b/mercurial/i18n.py
@@ -11,7 +11,6 @@ import locale
 import os
 import sys
 
-from .pycompat import getattr
 from .utils import resourceutil
 from . import (
     encoding,
diff --git a/mercurial/keepalive.py b/mercurial/keepalive.py
--- a/mercurial/keepalive.py
+++ b/mercurial/keepalive.py
@@ -90,7 +90,6 @@ import sys
 import threading
 
 from .i18n import _
-from .pycompat import getattr
 from .node import hex
 from . import (
     pycompat,
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -28,10 +28,6 @@ from .node import (
     sha1nodeconstants,
     short,
 )
-from .pycompat import (
-    delattr,
-    getattr,
-)
 from . import (
     bookmarks,
     branchmap,
diff --git a/mercurial/lock.py b/mercurial/lock.py
--- a/mercurial/lock.py
+++ b/mercurial/lock.py
@@ -15,7 +15,6 @@ import time
 import warnings
 
 from .i18n import _
-from .pycompat import getattr
 
 from . import (
     encoding,
diff --git a/mercurial/lsprof.py b/mercurial/lsprof.py
--- a/mercurial/lsprof.py
+++ b/mercurial/lsprof.py
@@ -1,8 +1,6 @@
 import _lsprof
 import sys
 
-from .pycompat import getattr
-
 Profiler = _lsprof.Profiler
 
 # PyPy doesn't expose profiler_entry from the module.
diff --git a/mercurial/mail.py b/mercurial/mail.py
--- a/mercurial/mail.py
+++ b/mercurial/mail.py
@@ -20,7 +20,6 @@ import time
 
 from .i18n import _
 from .pycompat import (
-    getattr,
     open,
 )
 from . import (
diff --git a/mercurial/manifest.py b/mercurial/manifest.py
--- a/mercurial/manifest.py
+++ b/mercurial/manifest.py
@@ -17,7 +17,6 @@ from .node import (
     hex,
     nullrev,
 )
-from .pycompat import getattr
 from . import (
     encoding,
     error,
diff --git a/mercurial/mdiff.py b/mercurial/mdiff.py
--- a/mercurial/mdiff.py
+++ b/mercurial/mdiff.py
@@ -11,10 +11,6 @@ import struct
 import zlib
 
 from .i18n import _
-from .pycompat import (
-    getattr,
-    setattr,
-)
 from . import (
     diffhelper,
     encoding,
diff --git a/mercurial/narrowspec.py b/mercurial/narrowspec.py
--- a/mercurial/narrowspec.py
+++ b/mercurial/narrowspec.py
@@ -8,7 +8,6 @@
 import weakref
 
 from .i18n import _
-from .pycompat import getattr
 from . import (
     error,
     match as matchmod,
diff --git a/mercurial/obsolete.py b/mercurial/obsolete.py
--- a/mercurial/obsolete.py
+++ b/mercurial/obsolete.py
@@ -73,7 +73,6 @@ import struct
 import weakref
 
 from .i18n import _
-from .pycompat import getattr
 from .node import (
     bin,
     hex,
diff --git a/mercurial/phases.py b/mercurial/phases.py
--- a/mercurial/phases.py
+++ b/mercurial/phases.py
@@ -111,10 +111,6 @@ from .node import (
     short,
     wdirrev,
 )
-from .pycompat import (
-    getattr,
-    setattr,
-)
 from . import (
     error,
     pycompat,
diff --git a/mercurial/policy.py b/mercurial/policy.py
--- a/mercurial/policy.py
+++ b/mercurial/policy.py
@@ -9,8 +9,6 @@
 import os
 import sys
 
-from .pycompat import getattr
-
 # Rules for how modules can be loaded. Values are:
 #
 #    c - require C extensions
diff --git a/mercurial/posix.py b/mercurial/posix.py
--- a/mercurial/posix.py
+++ b/mercurial/posix.py
@@ -36,7 +36,6 @@ from typing import (
 
 from .i18n import _
 from .pycompat import (
-    getattr,
     open,
 )
 from . import (
diff --git a/mercurial/profiling.py b/mercurial/profiling.py
--- a/mercurial/profiling.py
+++ b/mercurial/profiling.py
@@ -10,7 +10,6 @@ import contextlib
 
 from .i18n import _
 from .pycompat import (
-    getattr,
     open,
 )
 from . import (
diff --git a/mercurial/pure/osutil.py b/mercurial/pure/osutil.py
--- a/mercurial/pure/osutil.py
+++ b/mercurial/pure/osutil.py
@@ -11,7 +11,6 @@ import ctypes.util
 import os
 import stat as statmod
 
-from ..pycompat import getattr
 from .. import (
     encoding,
     pycompat,
diff --git a/mercurial/repoview.py b/mercurial/repoview.py
--- a/mercurial/repoview.py
+++ b/mercurial/repoview.py
@@ -15,11 +15,6 @@ from .node import (
     hex,
     nullrev,
 )
-from .pycompat import (
-    delattr,
-    getattr,
-    setattr,
-)
 from . import (
     error,
     obsolete,
diff --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -32,7 +32,6 @@ from .node import (
     wdirrev,
 )
 from .i18n import _
-from .pycompat import getattr
 from .revlogutils.constants import (
     ALL_KINDS,
     CHANGELOGV2,
diff --git a/mercurial/revlogutils/deltas.py b/mercurial/revlogutils/deltas.py
--- a/mercurial/revlogutils/deltas.py
+++ b/mercurial/revlogutils/deltas.py
@@ -14,7 +14,6 @@ import struct
 # import stuff from node for others to import from revlog
 from ..node import nullrev
 from ..i18n import _
-from ..pycompat import getattr
 
 from .constants import (
     COMP_MODE_DEFAULT,
diff --git a/mercurial/revset.py b/mercurial/revset.py
--- a/mercurial/revset.py
+++ b/mercurial/revset.py
@@ -12,7 +12,6 @@ import random
 import re
 
 from .i18n import _
-from .pycompat import getattr
 from .node import (
     bin,
     nullrev,
diff --git a/mercurial/revsetlang.py b/mercurial/revsetlang.py
--- a/mercurial/revsetlang.py
+++ b/mercurial/revsetlang.py
@@ -9,7 +9,6 @@
 import string
 
 from .i18n import _
-from .pycompat import getattr
 from .node import hex
 from . import (
     error,
diff --git a/mercurial/scmposix.py b/mercurial/scmposix.py
--- a/mercurial/scmposix.py
+++ b/mercurial/scmposix.py
@@ -9,7 +9,6 @@ from typing import (
     Tuple,
 )
 
-from .pycompat import getattr
 from . import (
     encoding,
     pycompat,
diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py
--- a/mercurial/scmutil.py
+++ b/mercurial/scmutil.py
@@ -23,7 +23,6 @@ from .node import (
     short,
     wdirrev,
 )
-from .pycompat import getattr
 from .thirdparty import attr
 from . import (
     copies as copiesmod,
diff --git a/mercurial/smartset.py b/mercurial/smartset.py
--- a/mercurial/smartset.py
+++ b/mercurial/smartset.py
@@ -6,7 +6,6 @@
 # GNU General Public License version 2 or any later version.
 
 
-from .pycompat import getattr
 from . import (
     encoding,
     error,
diff --git a/mercurial/sshpeer.py b/mercurial/sshpeer.py
--- a/mercurial/sshpeer.py
+++ b/mercurial/sshpeer.py
@@ -10,7 +10,6 @@ import re
 import uuid
 
 from .i18n import _
-from .pycompat import getattr
 from . import (
     error,
     pycompat,
diff --git a/mercurial/sslutil.py b/mercurial/sslutil.py
--- a/mercurial/sslutil.py
+++ b/mercurial/sslutil.py
@@ -15,7 +15,6 @@ import ssl
 import warnings
 
 from .i18n import _
-from .pycompat import getattr
 from .node import hex
 from . import (
     encoding,
diff --git a/mercurial/statprof.py b/mercurial/statprof.py
--- a/mercurial/statprof.py
+++ b/mercurial/statprof.py
@@ -167,7 +167,7 @@ class ProfileState:
         # a float
         if frequency:
             self.sample_interval = 1.0 / frequency
-        elif not pycompat.hasattr(self, 'sample_interval'):
+        elif not hasattr(self, 'sample_interval'):
             # default to 1000 Hz
             self.sample_interval = 1.0 / 1000.0
         else:
diff --git a/mercurial/store.py b/mercurial/store.py
--- a/mercurial/store.py
+++ b/mercurial/store.py
@@ -13,7 +13,6 @@ import stat
 from typing import Generator, List
 
 from .i18n import _
-from .pycompat import getattr
 from .thirdparty import attr
 from .node import hex
 from .revlogutils.constants import (
diff --git a/mercurial/strip.py b/mercurial/strip.py
--- a/mercurial/strip.py
+++ b/mercurial/strip.py
@@ -1,5 +1,4 @@
 from .i18n import _
-from .pycompat import getattr
 from . import (
     bookmarks as bookmarksmod,
     cmdutil,
diff --git a/mercurial/subrepoutil.py b/mercurial/subrepoutil.py
--- a/mercurial/subrepoutil.py
+++ b/mercurial/subrepoutil.py
@@ -11,7 +11,6 @@ import posixpath
 import re
 
 from .i18n import _
-from .pycompat import getattr
 from . import (
     config,
     error,
diff --git a/mercurial/templater.py b/mercurial/templater.py
--- a/mercurial/templater.py
+++ b/mercurial/templater.py
@@ -72,7 +72,6 @@ import os
 from .i18n import _
 from .pycompat import (
     FileNotFoundError,
-    getattr,
 )
 from . import (
     config,
diff --git a/mercurial/templateutil.py b/mercurial/templateutil.py
--- a/mercurial/templateutil.py
+++ b/mercurial/templateutil.py
@@ -10,7 +10,6 @@ import abc
 import types
 
 from .i18n import _
-from .pycompat import getattr
 from . import (
     error,
     pycompat,
diff --git a/mercurial/testing/storage.py b/mercurial/testing/storage.py
--- a/mercurial/testing/storage.py
+++ b/mercurial/testing/storage.py
@@ -12,7 +12,6 @@ from ..node import (
     hex,
     nullrev,
 )
-from ..pycompat import getattr
 from .. import (
     error,
     mdiff,
diff --git a/mercurial/ui.py b/mercurial/ui.py
--- a/mercurial/ui.py
+++ b/mercurial/ui.py
@@ -37,7 +37,6 @@ from typing import (
 from .i18n import _
 from .node import hex
 from .pycompat import (
-    getattr,
     open,
 )
 
diff --git a/mercurial/unionrepo.py b/mercurial/unionrepo.py
--- a/mercurial/unionrepo.py
+++ b/mercurial/unionrepo.py
@@ -13,7 +13,6 @@ allowing operations like diff and log wi
 
 
 from .i18n import _
-from .pycompat import getattr
 
 from . import (
     changelog,
diff --git a/mercurial/upgrade_utils/engine.py b/mercurial/upgrade_utils/engine.py
--- a/mercurial/upgrade_utils/engine.py
+++ b/mercurial/upgrade_utils/engine.py
@@ -9,7 +9,6 @@
 import stat
 
 from ..i18n import _
-from ..pycompat import getattr
 from .. import (
     error,
     metadata,
diff --git a/mercurial/urllibcompat.py b/mercurial/urllibcompat.py
--- a/mercurial/urllibcompat.py
+++ b/mercurial/urllibcompat.py
@@ -11,7 +11,6 @@ import urllib.parse
 import urllib.request
 import urllib.response
 
-from .pycompat import getattr
 from . import pycompat
 
 _sysstr = pycompat.sysstr
diff --git a/mercurial/util.py b/mercurial/util.py
--- a/mercurial/util.py
+++ b/mercurial/util.py
@@ -37,10 +37,7 @@ import warnings
 from .node import hex
 from .thirdparty import attr
 from .pycompat import (
-    delattr,
-    getattr,
     open,
-    setattr,
 )
 from hgdemandimport import tracing
 from . import (
diff --git a/mercurial/utils/compression.py b/mercurial/utils/compression.py
--- a/mercurial/utils/compression.py
+++ b/mercurial/utils/compression.py
@@ -8,7 +8,6 @@ import bz2
 import collections
 import zlib
 
-from ..pycompat import getattr
 from .. import (
     error,
     i18n,
diff --git a/mercurial/utils/procutil.py b/mercurial/utils/procutil.py
--- a/mercurial/utils/procutil.py
+++ b/mercurial/utils/procutil.py
@@ -24,7 +24,6 @@ from typing import (
 
 from ..i18n import _
 from ..pycompat import (
-    getattr,
     open,
 )
 
diff --git a/mercurial/utils/urlutil.py b/mercurial/utils/urlutil.py
--- a/mercurial/utils/urlutil.py
+++ b/mercurial/utils/urlutil.py
@@ -9,10 +9,6 @@ import re as remod
 import socket
 
 from ..i18n import _
-from ..pycompat import (
-    getattr,
-    setattr,
-)
 from .. import (
     encoding,
     error,
diff --git a/mercurial/vfs.py b/mercurial/vfs.py
--- a/mercurial/vfs.py
+++ b/mercurial/vfs.py
@@ -16,11 +16,6 @@ from typing import (
 )
 
 from .i18n import _
-from .pycompat import (
-    delattr,
-    getattr,
-    setattr,
-)
 from . import (
     encoding,
     error,
diff --git a/mercurial/windows.py b/mercurial/windows.py
--- a/mercurial/windows.py
+++ b/mercurial/windows.py
@@ -33,7 +33,6 @@ from typing import (
 )
 
 from .i18n import _
-from .pycompat import getattr
 from . import (
     encoding,
     error,
diff --git a/mercurial/wireprotoframing.py b/mercurial/wireprotoframing.py
--- a/mercurial/wireprotoframing.py
+++ b/mercurial/wireprotoframing.py
@@ -14,7 +14,6 @@ import collections
 import struct
 
 from .i18n import _
-from .pycompat import getattr
 from .thirdparty import attr
 from . import (
     encoding,
diff --git a/mercurial/wireprototypes.py b/mercurial/wireprototypes.py
--- a/mercurial/wireprototypes.py
+++ b/mercurial/wireprototypes.py
@@ -9,7 +9,6 @@ from .node import (
     hex,
 )
 from .i18n import _
-from .pycompat import getattr
 from .thirdparty import attr
 from . import (
     error,
diff --git a/mercurial/wireprotov1peer.py b/mercurial/wireprotov1peer.py
--- a/mercurial/wireprotov1peer.py
+++ b/mercurial/wireprotov1peer.py
@@ -12,10 +12,6 @@ import weakref
 from concurrent import futures
 from .i18n import _
 from .node import bin
-from .pycompat import (
-    getattr,
-    setattr,
-)
 from . import (
     bundle2,
     changegroup as changegroupmod,
diff --git a/mercurial/wireprotov1server.py b/mercurial/wireprotov1server.py
--- a/mercurial/wireprotov1server.py
+++ b/mercurial/wireprotov1server.py
@@ -11,7 +11,6 @@ import os
 
 from .i18n import _
 from .node import hex
-from .pycompat import getattr
 
 from . import (
     bundle2,