浏览代码

direct: Additional cleanup, update .pylintrc file

rdb 2 年之前
父节点
当前提交
9a15e9245c

+ 506 - 313
.pylintrc

@@ -1,27 +1,73 @@
-[MASTER]
+[MAIN]
+
+# Analyse import fallback blocks. This can be used to support both Python 2 and
+# 3 compatible code, which means that the block might have code that exists
+# only in one or another interpreter, leading to false positives when analysed.
+analyse-fallback-blocks=no
+
+# Load and enable all available extensions. Use --list-extensions to see a list
+# all available extensions.
+#enable-all-extensions=
+
+# In error mode, messages with a category besides ERROR or FATAL are
+# suppressed, and no reports are done by default. Error mode is compatible with
+# disabling specific errors.
+#errors-only=
+
+# Always return a 0 (non-error) status code, even if lint errors are found.
+# This is primarily useful in continuous integration scripts.
+#exit-zero=
 
 # A comma-separated list of package or module names from where C extensions may
 # be loaded. Extensions are loading into the active Python interpreter and may
 # run arbitrary code.
-extension-pkg-whitelist=panda3d
+extension-pkg-allow-list=panda3d,wx
 
-# Specify a score threshold to be exceeded before program exits with error.
+# A comma-separated list of package or module names from where C extensions may
+# be loaded. Extensions are loading into the active Python interpreter and may
+# run arbitrary code. (This is an alternative name to extension-pkg-allow-list
+# for backward compatibility.)
+extension-pkg-whitelist=panda3d,wx
+
+# Return non-zero exit code if any of these messages/categories are detected,
+# even if score is above --fail-under value. Syntax same as enable. Messages
+# specified are enabled, while categories only check already-enabled messages.
+fail-on=
+
+# Specify a score threshold under which the program will exit with error.
 fail-under=10.0
 
-# Add files or directories to the blacklist. They should be base names, not
-# paths.
+# Interpret the stdin as a python script, whose filename needs to be passed as
+# the module_or_package argument.
+#from-stdin=
+
+# Files or directories to be skipped. They should be base names, not paths.
 ignore=thirdparty
 
-# Add files or directories matching the regex patterns to the blacklist. The
-# regex matches against base names, not paths.
+# Add files or directories matching the regular expressions patterns to the
+# ignore-list. The regex matches against paths and can be in Posix or Windows
+# format. Because '\\' represents the directory delimiter on Windows systems,
+# it can't be used as an escape character.
+ignore-paths=
+
+# Files or directories matching the regular expression patterns are skipped.
+# The regex matches against base names, not paths. The default value ignores
+# Emacs file locks
 ignore-patterns=
 
+# List of module names for which member attributes should not be checked
+# (useful for modules/projects where namespaces are manipulated during runtime
+# and thus existing member attributes cannot be deduced by static analysis). It
+# supports qualified module names, as well as Unix pattern matching.
+ignored-modules=
+
 # Python code to execute, usually for sys.path manipulation such as
 # pygtk.require().
 #init-hook=
 
 # Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the
-# number of processors available to use.
+# number of processors available to use, and will cap the count on Windows to
+# avoid hangs.
 jobs=1
 
 # Control the amount of potential inferred values when inferring a single
@@ -36,259 +82,23 @@ load-plugins=
 # Pickle collected data for later comparisons.
 persistent=yes
 
+# Minimum Python version to use for version dependent checks. Will default to
+# the version used to run pylint.
+py-version=3.6
+
+# Discover python modules and packages in the file system subtree.
+recursive=no
+
 # When enabled, pylint would attempt to guess common misconfiguration and emit
 # user-friendly hints instead of false-positive error messages.
 suggestion-mode=yes
 
 # Allow loading of arbitrary C extensions. Extensions are imported into the
 # active Python interpreter and may run arbitrary code.
-unsafe-load-any-extension=no
-
-
-[MESSAGES CONTROL]
-
-# Only show warnings with the listed confidence levels. Leave empty to show
-# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED.
-confidence=
-
-# Disable the message, report, category or checker with the given id(s). You
-# can either give multiple identifiers separated by comma (,) or put this
-# option multiple times (only on the command line, not in the configuration
-# file where it should appear only once). You can also use "--disable=all" to
-# disable everything first and then reenable specific checks. For example, if
-# you want to run only the similarities checker, you can use "--disable=all
-# --enable=similarities". If you want to run only the classes checker, but have
-# no Warning level messages displayed, use "--disable=all --enable=classes
-# --disable=W".
-disable=attribute-defined-outside-init,
-        broad-except,
-        comparison-with-callable,
-        dangerous-default-value,
-        global-statement,
-        import-outside-toplevel,
-        invalid-name,
-        line-too-long,
-        misplaced-comparison-constant,
-        missing-class-docstring,
-        missing-function-docstring,
-        missing-module-docstring,
-        protected-access,
-        r,
-        raise-missing-from,
-        redefined-builtin,
-        redefined-outer-name,
-        too-many-lines,
-        unused-argument,
-        unused-variable,
-        unused-wildcard-import,
-        using-constant-test,
-        wildcard-import,
-        wrong-import-order,
-        wrong-import-position
-
-# Enable the message, report, category or checker with the given id(s). You can
-# either give multiple identifier separated by comma (,) or put this option
-# multiple time (only on the command line, not in the configuration file where
-# it should appear only once). See also the "--disable" option for examples.
-enable=c-extension-no-member
-
-
-[REPORTS]
-
-# Python expression which should return a score less than or equal to 10. You
-# have access to the variables 'error', 'warning', 'refactor', and 'convention'
-# which contain the number of messages in each category, as well as 'statement'
-# which is the total number of statements analyzed. This score is used by the
-# global evaluation report (RP0004).
-evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
-
-# Template used to display messages. This is a python new-style format string
-# used to format the message information. See doc for all details.
-#msg-template=
-
-# Set the output format. Available formats are text, parseable, colorized, json
-# and msvs (visual studio). You can also give a reporter class, e.g.
-# mypackage.mymodule.MyReporterClass.
-output-format=text
-
-# Tells whether to display a full report or only the messages.
-reports=no
-
-# Activate the evaluation score.
-score=yes
-
-
-[REFACTORING]
-
-# Maximum number of nested blocks for function / method body
-max-nested-blocks=5
-
-# Complete name of functions that never returns. When checking for
-# inconsistent-return-statements if a never returning function is called then
-# it will be considered as an explicit return statement and no message will be
-# printed.
-never-returning-functions=sys.exit
-
-
-[FORMAT]
-
-# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
-expected-line-ending-format=LF
-
-# Regexp for a line that is allowed to be longer than the limit.
-ignore-long-lines=^\s*(# )?<?https?://\S+>?$
-
-# Number of spaces of indent required inside a hanging or continued line.
-indent-after-paren=4
-
-# String used as indentation unit. This is usually "    " (4 spaces) or "\t" (1
-# tab).
-indent-string='    '
-
-# Maximum number of characters on a single line.
-max-line-length=100
-
-# Maximum number of lines in a module.
-max-module-lines=1000
-
-# Allow the body of a class to be on the same line as the declaration if body
-# contains single statement.
-single-line-class-stmt=no
-
-# Allow the body of an if to be on the same line as the test if there is no
-# else.
-single-line-if-stmt=no
-
-
-[SPELLING]
-
-# Limits count of emitted suggestions for spelling mistakes.
-max-spelling-suggestions=4
-
-# Spelling dictionary name. Available dictionaries: none. To make it work,
-# install the python-enchant package.
-spelling-dict=
-
-# List of comma separated words that should not be checked.
-spelling-ignore-words=
-
-# A path to a file that contains the private dictionary; one word per line.
-spelling-private-dict-file=
-
-# Tells whether to store unknown words to the private dictionary (see the
-# --spelling-private-dict-file option) instead of raising a message.
-spelling-store-unknown-words=no
-
-
-[TYPECHECK]
-
-# List of decorators that produce context managers, such as
-# contextlib.contextmanager. Add to this list to register other decorators that
-# produce valid context managers.
-contextmanager-decorators=contextlib.contextmanager
-
-# List of members which are set dynamically and missed by pylint inference
-# system, and so shouldn't trigger E1101 when accessed. Python regular
-# expressions are accepted.
-generated-members=
-
-# Tells whether missing members accessed in mixin class should be ignored. A
-# mixin class is detected if its name ends with "mixin" (case insensitive).
-ignore-mixin-members=yes
-
-# Tells whether to warn about missing members when the owner of the attribute
-# is inferred to be None.
-ignore-none=yes
-
-# This flag controls whether pylint should warn about no-member and similar
-# checks whenever an opaque object is returned when inferring. The inference
-# can return multiple potential results while evaluating a Python object, but
-# some branches might not be evaluated, which results in partial inference. In
-# that case, it might be useful to still emit no-member and other checks for
-# the rest of the inferred objects.
-ignore-on-opaque-inference=yes
-
-# List of class names for which member attributes should not be checked (useful
-# for classes with dynamically set attributes). This supports the use of
-# qualified names.
-ignored-classes=optparse.Values,thread._local,_thread._local,direct.showbase.PythonUtil.ScratchPad
-
-# List of module names for which member attributes should not be checked
-# (useful for modules/projects where namespaces are manipulated during runtime
-# and thus existing member attributes cannot be deduced by static analysis). It
-# supports qualified module names, as well as Unix pattern matching.
-ignored-modules=
-
-# Show a hint with possible names when a member name was not found. The aspect
-# of finding the hint is based on edit distance.
-missing-member-hint=yes
-
-# The minimum edit distance a name should have in order to be considered a
-# similar match for a missing member name.
-missing-member-hint-distance=1
-
-# The total number of similar names that should be taken in consideration when
-# showing a hint for a missing member.
-missing-member-max-choices=1
-
-# List of decorators that change the signature of a decorated function.
-signature-mutators=
-
+#unsafe-load-any-extension=no
 
-[SIMILARITIES]
-
-# Ignore comments when computing similarities.
-ignore-comments=yes
-
-# Ignore docstrings when computing similarities.
-ignore-docstrings=yes
-
-# Ignore imports when computing similarities.
-ignore-imports=no
-
-# Minimum lines number of a similarity.
-min-similarity-lines=4
-
-
-[VARIABLES]
-
-# List of additional names supposed to be defined in builtins. Remember that
-# you should avoid defining new builtins when possible.
-additional-builtins=base,simbase,__dev__,onScreenDebug,globalClock,render,hidden,cluster
-
-# Tells whether unused global variables should be treated as a violation.
-allow-global-unused-variables=yes
-
-# List of strings which can identify a callback function by name. A callback
-# name must start or end with one of those strings.
-callbacks=cb_,
-          _cb
-
-# A regular expression matching the name of dummy variables (i.e. expected to
-# not be used).
-dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_
-
-# Argument names that match this expression will be ignored. Default to name
-# with leading underscore.
-ignored-argument-names=_.*|^ignored_|^unused_
-
-# Tells whether we should check for unused import in __init__ files.
-init-import=no
-
-# List of qualified module names which can have objects that can redefine
-# builtins.
-redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io
-
-
-[MISCELLANEOUS]
-
-# List of note tags to take in consideration, separated by a comma.
-notes=FIXME,
-      XXX,
-      TODO
-
-# Regular expression of note tags to take in consideration.
-#notes-rgx=
+# In verbose mode, extra non-checker-related info will be displayed.
+#verbose=
 
 
 [BASIC]
@@ -297,13 +107,15 @@ notes=FIXME,
 argument-naming-style=snake_case
 
 # Regular expression matching correct argument names. Overrides argument-
-# naming-style.
+# naming-style. If left empty, argument names will be checked with the set
+# naming style.
 #argument-rgx=
 
 # Naming style matching correct attribute names.
 attr-naming-style=snake_case
 
 # Regular expression matching correct attribute names. Overrides attr-naming-
+# style. If left empty, attribute names will be checked with the set naming
 # style.
 #attr-rgx=
 
@@ -323,20 +135,30 @@ bad-names-rgxs=
 class-attribute-naming-style=any
 
 # Regular expression matching correct class attribute names. Overrides class-
-# attribute-naming-style.
+# attribute-naming-style. If left empty, class attribute names will be checked
+# with the set naming style.
 #class-attribute-rgx=
 
+# Naming style matching correct class constant names.
+class-const-naming-style=UPPER_CASE
+
+# Regular expression matching correct class constant names. Overrides class-
+# const-naming-style. If left empty, class constant names will be checked with
+# the set naming style.
+#class-const-rgx=
+
 # Naming style matching correct class names.
 class-naming-style=PascalCase
 
 # Regular expression matching correct class names. Overrides class-naming-
-# style.
+# style. If left empty, class names will be checked with the set naming style.
 #class-rgx=
 
 # Naming style matching correct constant names.
 const-naming-style=UPPER_CASE
 
 # Regular expression matching correct constant names. Overrides const-naming-
+# style. If left empty, constant names will be checked with the set naming
 # style.
 #const-rgx=
 
@@ -348,7 +170,8 @@ docstring-min-length=-1
 function-naming-style=snake_case
 
 # Regular expression matching correct function names. Overrides function-
-# naming-style.
+# naming-style. If left empty, function names will be checked with the set
+# naming style.
 #function-rgx=
 
 # Good variable names which should always be accepted, separated by a comma.
@@ -370,21 +193,22 @@ include-naming-hint=no
 inlinevar-naming-style=any
 
 # Regular expression matching correct inline iteration names. Overrides
-# inlinevar-naming-style.
+# inlinevar-naming-style. If left empty, inline iteration names will be checked
+# with the set naming style.
 #inlinevar-rgx=
 
 # Naming style matching correct method names.
 method-naming-style=snake_case
 
 # Regular expression matching correct method names. Overrides method-naming-
-# style.
+# style. If left empty, method names will be checked with the set naming style.
 #method-rgx=
 
 # Naming style matching correct module names.
 module-naming-style=snake_case
 
 # Regular expression matching correct module names. Overrides module-naming-
-# style.
+# style. If left empty, module names will be checked with the set naming style.
 #module-rgx=
 
 # Colon-delimited sets of names that determine each other's naming style when
@@ -400,38 +224,55 @@ no-docstring-rgx=^_
 # These decorators are taken in consideration only for invalid-name.
 property-classes=abc.abstractproperty
 
+# Regular expression matching correct type variable names. If left empty, type
+# variable names will be checked with the set naming style.
+#typevar-rgx=
+
 # Naming style matching correct variable names.
 variable-naming-style=snake_case
 
 # Regular expression matching correct variable names. Overrides variable-
-# naming-style.
+# naming-style. If left empty, variable names will be checked with the set
+# naming style.
 #variable-rgx=
 
 
-[LOGGING]
-
-# The type of string formatting that logging methods do. `old` means using %
-# formatting, `new` is for `{}` formatting.
-logging-format-style=old
-
-# Logging modules to check that the string format arguments are in logging
-# function parameter format.
-logging-modules=logging
-
+[CLASSES]
 
-[STRING]
+# Warn about protected attribute access inside special methods
+check-protected-access-in-special-methods=no
 
-# This flag controls whether inconsistent-quotes generates a warning when the
-# character used as a quote delimiter is used inconsistently within a module.
-check-quote-consistency=no
+# List of method names used to declare (i.e. assign) instance attributes.
+defining-attr-methods=__init__,
+                      __new__,
+                      setUp,
+                      __post_init__
 
-# This flag controls whether the implicit-str-concat should generate a warning
-# on implicit string concatenation in sequences defined over several lines.
-check-str-concat-over-line-jumps=no
+# List of member names, which should be excluded from the protected access
+# warning.
+exclude-protected=_asdict,
+                  _fields,
+                  _replace,
+                  _source,
+                  _make
+
+# List of valid names for the first argument in a class method.
+valid-classmethod-first-arg=cls
+
+# List of valid names for the first argument in a metaclass class method.
+valid-metaclass-classmethod-first-arg=cls
 
 
 [DESIGN]
 
+# List of regular expressions of class ancestor names to ignore when counting
+# public methods (see R0903)
+exclude-too-few-public-methods=
+
+# List of qualified class names to ignore when counting class parents (see
+# R0901)
+ignored-parents=
+
 # Maximum number of arguments for function / method.
 max-args=5
 
@@ -463,6 +304,42 @@ max-statements=50
 min-public-methods=2
 
 
+[EXCEPTIONS]
+
+# Exceptions that will emit a warning when caught.
+overgeneral-exceptions=builtins.BaseException,builtins.Exception
+
+
+[FORMAT]
+
+# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
+expected-line-ending-format=LF
+
+# Regexp for a line that is allowed to be longer than the limit.
+ignore-long-lines=^\s*(# )?<?https?://\S+>?$
+
+# Number of spaces of indent required inside a hanging or continued line.
+indent-after-paren=4
+
+# String used as indentation unit. This is usually "    " (4 spaces) or "\t" (1
+# tab).
+indent-string='    '
+
+# Maximum number of characters on a single line.
+max-line-length=100
+
+# Maximum number of lines in a module.
+max-module-lines=1000
+
+# Allow the body of a class to be on the same line as the declaration if body
+# contains single statement.
+single-line-class-stmt=no
+
+# Allow the body of an if to be on the same line as the test if there is no
+# else.
+single-line-if-stmt=no
+
+
 [IMPORTS]
 
 # List of modules that can be imported at any level, not just the top level
@@ -472,24 +349,20 @@ allow-any-import-level=
 # Allow wildcard imports from modules that define __all__.
 allow-wildcard-with-all=no
 
-# Analyse import fallback blocks. This can be used to support both Python 2 and
-# 3 compatible code, which means that the block might have code that exists
-# only in one or another interpreter, leading to false positives when analysed.
-analyse-fallback-blocks=no
-
 # Deprecated modules which should not be used, separated by a comma.
-deprecated-modules=optparse,tkinter.tix
+deprecated-modules=optparse,tkinter.tix,pandac.PandaModules,direct.directbase.DirectStart
 
-# Create a graph of external dependencies in the given file (report RP0402 must
-# not be disabled).
+# Output a graph (.gv or any supported image format) of external dependencies
+# to the given file (report RP0402 must not be disabled).
 ext-import-graph=
 
-# Create a graph of every (i.e. internal and external) dependencies in the
-# given file (report RP0402 must not be disabled).
+# Output a graph (.gv or any supported image format) of all (i.e. internal and
+# external) dependencies to the given file (report RP0402 must not be
+# disabled).
 import-graph=
 
-# Create a graph of internal dependencies in the given file (report RP0402 must
-# not be disabled).
+# Output a graph (.gv or any supported image format) of internal dependencies
+# to the given file (report RP0402 must not be disabled).
 int-import-graph=
 
 # Force import order to recognize a module as part of the standard
@@ -503,32 +376,352 @@ known-third-party=enchant
 preferred-modules=
 
 
-[CLASSES]
+[LOGGING]
 
-# List of method names used to declare (i.e. assign) instance attributes.
-defining-attr-methods=__init__,
-                      __new__,
-                      setUp,
-                      __post_init__
+# The type of string formatting that logging methods do. `old` means using %
+# formatting, `new` is for `{}` formatting.
+logging-format-style=old
 
-# List of member names, which should be excluded from the protected access
-# warning.
-exclude-protected=_asdict,
-                  _fields,
-                  _replace,
-                  _source,
-                  _make
+# Logging modules to check that the string format arguments are in logging
+# function parameter format.
+logging-modules=logging
 
-# List of valid names for the first argument in a class method.
-valid-classmethod-first-arg=cls
 
-# List of valid names for the first argument in a metaclass class method.
-valid-metaclass-classmethod-first-arg=cls
+[MESSAGES CONTROL]
 
+# Only show warnings with the listed confidence levels. Leave empty to show
+# all. Valid levels: HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE,
+# UNDEFINED.
+confidence=HIGH,
+           CONTROL_FLOW,
+           INFERENCE,
+           INFERENCE_FAILURE,
+           UNDEFINED
 
-[EXCEPTIONS]
+# Disable the message, report, category or checker with the given id(s). You
+# can either give multiple identifiers separated by comma (,) or put this
+# option multiple times (only on the command line, not in the configuration
+# file where it should appear only once). You can also use "--disable=all" to
+# disable everything first and then re-enable specific checks. For example, if
+# you want to run only the similarities checker, you can use "--disable=all
+# --enable=similarities". If you want to run only the classes checker, but have
+# no Warning level messages displayed, use "--disable=all --enable=classes
+# --disable=W".
+disable=raw-checker-failed,
+        bad-inline-option,
+        locally-disabled,
+        file-ignored,
+        suppressed-message,
+        useless-suppression,
+        deprecated-pragma,
+        use-symbolic-message-instead,
+        consider-using-f-string,
+        attribute-defined-outside-init,
+        comparison-with-callable,
+        dangerous-default-value,
+        global-statement,
+        import-outside-toplevel,
+        invalid-name,
+        line-too-long,
+        missing-class-docstring,
+        missing-function-docstring,
+        missing-module-docstring,
+        protected-access,
+        no-classmethod-decorator,
+        no-staticmethod-decorator,
+        useless-object-inheritance,
+        property-with-parameters,
+        too-many-ancestors,
+        too-many-instance-attributes,
+        too-few-public-methods,
+        too-many-public-methods,
+        too-many-return-statements,
+        too-many-branches,
+        too-many-arguments,
+        too-many-locals,
+        too-many-statements,
+        too-many-boolean-expressions,
+        consider-merging-isinstance,
+        too-many-nested-blocks,
+        simplifiable-if-statement,
+        redefined-argument-from-local,
+        no-else-return,
+        consider-using-ternary,
+        trailing-comma-tuple,
+        stop-iteration-return,
+        simplify-boolean-expression,
+        inconsistent-return-statements,
+        useless-return,
+        consider-swap-variables,
+        consider-using-join,
+        consider-using-in,
+        consider-using-get,
+        chained-comparison,
+        consider-using-dict-comprehension,
+        consider-using-set-comprehension,
+        simplifiable-if-expression,
+        no-else-raise,
+        unnecessary-comprehension,
+        consider-using-sys-exit,
+        no-else-break,
+        no-else-continue,
+        super-with-arguments,
+        simplifiable-condition,
+        condition-evals-to-constant,
+        consider-using-generator,
+        use-a-generator,
+        consider-using-min-builtin,
+        consider-using-max-builtin,
+        consider-using-with,
+        unnecessary-dict-index-lookup,
+        use-list-literal,
+        use-dict-literal,
+        unnecessary-list-index-lookup,
+        literal-comparison,
+        comparison-with-itself,
+        comparison-of-constants,
+        cyclic-import,
+        consider-using-from-import,
+        duplicate-code,
+        raise-missing-from,
+        redefined-builtin,
+        redefined-outer-name,
+        too-many-lines,
+        unused-argument,
+        unused-variable,
+        unused-wildcard-import,
+        using-constant-test,
+        wrong-import-order,
+        wrong-import-position,
+        not-callable
+
+# Enable the message, report, category or checker with the given id(s). You can
+# either give multiple identifier separated by comma (,) or put this option
+# multiple time (only on the command line, not in the configuration file where
+# it should appear only once). See also the "--disable" option for examples.
+#enable=c-extension-no-member
 
-# Exceptions that will emit a warning when being caught. Defaults to
-# "BaseException, Exception".
-overgeneral-exceptions=BaseException,
-                       Exception
+
+[MISCELLANEOUS]
+
+# List of note tags to take in consideration, separated by a comma.
+notes=FIXME,
+      XXX,
+      TODO
+
+# Regular expression of note tags to take in consideration.
+notes-rgx=
+
+
+[REFACTORING]
+
+# Maximum number of nested blocks for function / method body
+max-nested-blocks=5
+
+# Complete name of functions that never returns. When checking for
+# inconsistent-return-statements if a never returning function is called then
+# it will be considered as an explicit return statement and no message will be
+# printed.
+never-returning-functions=sys.exit
+
+
+[REPORTS]
+
+# Python expression which should return a score less than or equal to 10. You
+# have access to the variables 'fatal', 'error', 'warning', 'refactor',
+# 'convention', and 'info' which contain the number of messages in each
+# category, as well as 'statement' which is the total number of statements
+# analyzed. This score is used by the global evaluation report (RP0004).
+evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
+
+# Template used to display messages. This is a python new-style format string
+# used to format the message information. See doc for all details.
+msg-template=
+
+# Set the output format. Available formats are text, parseable, colorized, json
+# and msvs (visual studio). You can also give a reporter class, e.g.
+# mypackage.mymodule.MyReporterClass.
+#output-format=
+
+# Tells whether to display a full report or only the messages.
+reports=no
+
+# Activate the evaluation score.
+score=yes
+
+
+[SIMILARITIES]
+
+# Comments are removed from the similarity computation
+ignore-comments=yes
+
+# Docstrings are removed from the similarity computation
+ignore-docstrings=yes
+
+# Imports are removed from the similarity computation
+ignore-imports=no
+
+# Signatures are removed from the similarity computation
+ignore-signatures=yes
+
+# Minimum lines number of a similarity.
+min-similarity-lines=4
+
+
+[SPELLING]
+
+# Limits count of emitted suggestions for spelling mistakes.
+max-spelling-suggestions=4
+
+# Spelling dictionary name. Available dictionaries: none. To make it work,
+# install the 'python-enchant' package.
+spelling-dict=
+
+# List of comma separated words that should be considered directives if they
+# appear at the beginning of a comment and should not be checked.
+spelling-ignore-comment-directives=fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy:
+
+# List of comma separated words that should not be checked.
+spelling-ignore-words=
+
+# A path to a file that contains the private dictionary; one word per line.
+spelling-private-dict-file=
+
+# Tells whether to store unknown words to the private dictionary (see the
+# --spelling-private-dict-file option) instead of raising a message.
+spelling-store-unknown-words=no
+
+
+[STRING]
+
+# This flag controls whether inconsistent-quotes generates a warning when the
+# character used as a quote delimiter is used inconsistently within a module.
+check-quote-consistency=no
+
+# This flag controls whether the implicit-str-concat should generate a warning
+# on implicit string concatenation in sequences defined over several lines.
+check-str-concat-over-line-jumps=no
+
+
+[TYPECHECK]
+
+# List of decorators that produce context managers, such as
+# contextlib.contextmanager. Add to this list to register other decorators that
+# produce valid context managers.
+contextmanager-decorators=contextlib.contextmanager
+
+# List of members which are set dynamically and missed by pylint inference
+# system, and so shouldn't trigger E1101 when accessed. Python regular
+# expressions are accepted.
+generated-members=base.cr,
+                  base.le,
+                  Pmw.AboutDialog,
+                  Pmw.Balloon,
+                  Pmw.ButtonBox,
+                  Pmw.Color,
+                  Pmw.ComboBox,
+                  Pmw.EntryField,
+                  Pmw.Group,
+                  Pmw.INITOPT,
+                  Pmw.MegaArchetype,
+                  Pmw.MegaToplevel,
+                  Pmw.MegaWidget,
+                  Pmw.MenuBar,
+                  Pmw.MessageBar,
+                  Pmw.NoteBook,
+                  Pmw.OptionMenu,
+                  Pmw.OptionMenu,
+                  Pmw.PanedWidget,
+                  Pmw.ScrolledCanvas,
+                  Pmw.ScrolledFrame,
+                  Pmw.ScrolledListBox,
+                  Pmw.ScrolledText,
+                  Pmw.aboutcontact,
+                  Pmw.aboutcopyright,
+                  Pmw.aboutversion,
+                  Pmw.forwardmethods,
+                  Pmw.popgrab,
+                  Pmw.pushgrab,
+                  Pmw.setgeometryanddeiconify
+
+# Tells whether to warn about missing members when the owner of the attribute
+# is inferred to be None.
+ignore-none=yes
+
+# This flag controls whether pylint should warn about no-member and similar
+# checks whenever an opaque object is returned when inferring. The inference
+# can return multiple potential results while evaluating a Python object, but
+# some branches might not be evaluated, which results in partial inference. In
+# that case, it might be useful to still emit no-member and other checks for
+# the rest of the inferred objects.
+ignore-on-opaque-inference=yes
+
+# List of symbolic message names to ignore for Mixin members.
+ignored-checks-for-mixins=no-member,
+                          not-async-context-manager,
+                          not-context-manager,
+                          attribute-defined-outside-init
+
+# List of class names for which member attributes should not be checked (useful
+# for classes with dynamically set attributes). This supports the use of
+# qualified names.
+ignored-classes=optparse.Values,thread._local,_thread._local,direct.showbase.PythonUtil.ScratchPad
+
+# Show a hint with possible names when a member name was not found. The aspect
+# of finding the hint is based on edit distance.
+missing-member-hint=yes
+
+# The minimum edit distance a name should have in order to be considered a
+# similar match for a missing member name.
+missing-member-hint-distance=1
+
+# The total number of similar names that should be taken in consideration when
+# showing a hint for a missing member.
+missing-member-max-choices=1
+
+# Regex pattern to define which classes are considered mixins.
+mixin-class-rgx=.*[Mm]ixin
+
+# List of decorators that change the signature of a decorated function.
+signature-mutators=
+
+
+[VARIABLES]
+
+# List of additional names supposed to be defined in builtins. Remember that
+# you should avoid defining new builtins when possible.
+additional-builtins=base,
+                    simbase,
+                    __dev__,
+                    onScreenDebug,
+                    render,
+                    hidden,
+                    cluster,
+                    launcher,
+                    taskMgr,
+                    localAvatar
+
+# Tells whether unused global variables should be treated as a violation.
+allow-global-unused-variables=yes
+
+# List of names allowed to shadow builtins
+allowed-redefined-builtins=
+
+# List of strings which can identify a callback function by name. A callback
+# name must start or end with one of those strings.
+callbacks=cb_,
+          _cb
+
+# A regular expression matching the name of dummy variables (i.e. expected to
+# not be used).
+dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_
+
+# Argument names that match this expression will be ignored.
+ignored-argument-names=_.*|^ignored_|^unused_
+
+# Tells whether we should check for unused import in __init__ files.
+init-import=no
+
+# List of qualified module names which can have objects that can redefine
+# builtins.
+redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io,direct.showbase.ShowBase,direct.showbase.PythonUtil

+ 5 - 5
direct/src/cluster/ClusterServer.py

@@ -29,6 +29,7 @@ from direct.directnotify import DirectNotifyGlobal
 from direct.showbase import DirectObject
 from direct.task import Task
 from direct.task.TaskManagerGlobal import taskMgr
+import builtins
 
 # NOTE: This assumes the following variables are set via bootstrap command line
 # arguments on server startup:
@@ -334,10 +335,9 @@ class ClusterServer(DirectObject.DirectObject):
 
 
     def handleMessageQueue(self):
-
-        #print self.messageQueue
+        #print(self.messageQueue)
         for data in self.messageQueue:
-            #print "in queue",dgi
+            #print("in queue", dgi)
             self.handleNamedMovement(data)
 
         self.messageQueue = []
@@ -352,8 +352,8 @@ class ClusterServer(DirectObject.DirectObject):
         """ Update cameraJig position to reflect latest position """
         (x, y, z, h, p, r, sx, sy, sz) = self.msgHandler.parseSelectedMovementDatagram(
             dgi)
-        if last:
-            last.setPosHprScale(x, y, z, h, p, r, sx, sy, sz)
+        if getattr(builtins, 'last', None):
+            builtins.last.setPosHprScale(x, y, z, h, p, r, sx, sy, sz)
 
     def handleTimeData(self, dgi):
         """ Update cameraJig position to reflect latest position """

+ 5 - 5
direct/src/directdevices/DirectDeviceManager.py

@@ -59,7 +59,7 @@ class DirectButtons(ButtonNode, DirectObject):
         # Attach node to data graph
         try:
             self._base = base
-        except:
+        except NameError:
             self._base = simbase
         self.nodePath = self._base.dataRoot.attachNewNode(self)
 
@@ -108,7 +108,7 @@ class DirectAnalogs(AnalogNode, DirectObject):
         # Attach node to data graph
         try:
             self._base = base
-        except:
+        except NameError:
             self._base = simbase
         self.nodePath = self._base.dataRoot.attachNewNode(self)
 
@@ -206,7 +206,7 @@ class DirectTracker(TrackerNode, DirectObject):
         # Attach node to data graph
         try:
             self._base = base
-        except:
+        except NameError:
             self._base = simbase
         self.nodePath = self._base.dataRoot.attachNewNode(self)
 
@@ -238,7 +238,7 @@ class DirectDials(DialNode, DirectObject):
         # Attach node to data graph
         try:
             self._base = base
-        except:
+        except NameError:
             self._base = simbase
         self.nodePath = self._base.dataRoot.attachNewNode(self)
 
@@ -289,7 +289,7 @@ class DirectTimecodeReader(AnalogNode, DirectObject):
         # Attach node to data graph
         try:
             self._base = base
-        except:
+        except NameError:
             self._base = simbase
         self.nodePath = self._base.dataRoot.attachNewNode(self)
 

+ 2 - 2
direct/src/directscripts/extract_docs.py

@@ -16,11 +16,11 @@ from panda3d.interrogatedb import *
 
 
 if 'interrogate_element_is_sequence' not in globals():
-    def interrogate_element_is_sequence(element):
+    def interrogate_element_is_sequence(element): # pylint: disable=function-redefined
         return False
 
 if 'interrogate_element_is_mapping' not in globals():
-    def interrogate_element_is_mapping(element):
+    def interrogate_element_is_mapping(element): # pylint: disable=function-redefined
         return False
 
 

+ 4 - 4
direct/src/directtools/DirectGlobals.py

@@ -51,11 +51,11 @@ LE_CAM_MASKS = {'persp':LE_PERSP_CAM_MASK,
                  'top':LE_TOP_CAM_MASK}
 
 def LE_showInAllCam(nodePath):
-    for camName in LE_CAM_MASKS:
-        nodePath.show(LE_CAM_MASKS[camName])
+    for camName, mask in LE_CAM_MASKS.items():
+        nodePath.show(mask)
 
 def LE_showInOneCam(nodePath, thisCamName):
     LE_showInAllCam(nodePath)
-    for camName in LE_CAM_MASKS:
+    for camName, mask in LE_CAM_MASKS.items():
         if camName != thisCamName:
-            nodePath.hide(LE_CAM_MASKS[camName])
+            nodePath.hide(mask)

+ 1 - 1
direct/src/distributed/DistributedCamera.py

@@ -2,7 +2,7 @@ from panda3d.core import ConfigVariableInt, GeomNode, NodePath, PerspectiveLens,
 from direct.fsm.FSM import FSM
 from direct.interval.IntervalGlobal import LerpScaleInterval, Sequence
 from direct.distributed.DistributedObject import DistributedObject
-
+from direct.showbase.MessengerGlobal import messenger
 
 _camera_id = ConfigVariableInt('camera-id', -1)
 _aware_of_cameras = ConfigVariableInt('aware-of-cameras', 0)

+ 1 - 0
direct/src/distributed/DistributedSmoothNode.py

@@ -465,6 +465,7 @@ class DistributedSmoothNode(DistributedNode.DistributedNode,
                     "Warning: couldn't find the avatar %d" % (avId))
             elif hasattr(other, "d_returnResync") and \
                  hasattr(self.cr, 'localAvatarDoId'):
+                globalClock = ClockObject.getGlobalClock()
                 realTime = globalClock.getRealTime()
                 serverTime = realTime - globalClockDelta.getDelta()
                 assert self.notify.info(

+ 2 - 2
direct/src/leveleditor/AnimControlUI.py

@@ -242,7 +242,7 @@ class TimeSlider(wx.Window):
 
         dc.SetPen(wx.BLACK_PEN)
         dc.SetBrush(wx.BLACK_BRUSH)
-        dc.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL))
+        dc.SetFont(wx.Font(10, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL))
 
         self.unitWidth = self.w/float(self.frameNum)
 
@@ -384,7 +384,7 @@ class TimeSlider(wx.Window):
     def DrawNumber(self, dc):
         dc.SetPen(wx.BLACK_PEN)
         dc.SetBrush(wx.BLACK_BRUSH)
-        dc.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL))
+        dc.SetFont(wx.Font(10, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL))
 
         i = self.curFrame-self.sliderStartFrame
         st = str(self.curFrame)

+ 1 - 1
direct/src/leveleditor/CurveEditor.py

@@ -49,7 +49,7 @@ class CurveEditor(DirectObject):
                             self.currentCurve = self.currentRope.ropeNode.getCurve()
                             self.currentCurve.setVertex(item[0], self.selected.getPos())
                             self.accept("DIRECT-delete", self.onControlerDelete)
-                            return task.cont
+                            return Task.cont
 
     def onControlerDelete(self):
         if self.editor.mode == self.editor.EDIT_CURVE_MODE:

+ 29 - 29
direct/src/leveleditor/GraphEditorUI.py

@@ -213,7 +213,7 @@ class GraphEditorWindow(wx.Window):
 
         dc.SetPen(wx.BLACK_PEN)
         dc.SetBrush(wx.BLACK_BRUSH)
-        dc.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.NORMAL))
+        dc.SetFont(wx.Font(8, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL))
 
         dc.DrawLine(self.zeroPos[0], 0.0, self.zeroPos[0], self.h)
         st = str(self.zero)
@@ -283,7 +283,7 @@ class GraphEditorWindow(wx.Window):
     def DrawYCoord(self,dc):
         dc.SetPen(wx.BLACK_PEN)
         dc.SetBrush(wx.BLACK_BRUSH)
-        dc.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.NORMAL))
+        dc.SetFont(wx.Font(8, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL))
 
         dc.DrawLine(0.0, self.zeroPos[1], self.w, self.zeroPos[1])
         st = str(self.zero)
@@ -530,21 +530,21 @@ class GraphEditorWindow(wx.Window):
             dc.DrawLine(self.newPos[0], self.newPos[1], self.pos[0], self.newPos[1])
             dc.DrawLine(self.newPos[0], self.newPos[1], self.newPos[0], self.pos[1])
 
-    def OnSize(self,evt):
+    def OnSize(self, evt):
         self.InitBuffer()
 
-    def OnLeftDown(self,evt):
+    def OnLeftDown(self, evt):
         point = (evt.GetX(), evt.GetY())
 
-        if point[1]>= 0.0 and point[1]<= float(self.h):
-            if point[0]>= 0.0 and point[0]<= float(self.w):
+        if point[1] >= 0.0 and point[1] <= float(self.h):
+            if point[0] >= 0.0 and point[0] <= float(self.w):
                 self._mouseIn = True
 
         if self._mouseIn:
             self.CaptureMouse()
             self.pos = point
 
-    def OnLeftUp(self,evt):
+    def OnLeftUp(self, evt):
         if self.GetCapture():
             self.ReleaseMouse()
             self._mouseIn = False
@@ -552,11 +552,11 @@ class GraphEditorWindow(wx.Window):
             self.setSelection()
             self.SetGraphEditorData(self.property, self.curFrame)
 
-    def OnMiddleDown(self,evt):
+    def OnMiddleDown(self, evt):
         point = (evt.GetX(), evt.GetY())
 
-        if point[1]>= 0.0 and point[1]<= float(self.h):
-            if point[0]>= 0.0 and point[0]<= float(self.w):
+        if point[1] >= 0.0 and point[1] <= float(self.h):
+            if point[0] >= 0.0 and point[0] <= float(self.w):
                 self._mouseIn = True
 
         if self._mouseIn:
@@ -567,12 +567,12 @@ class GraphEditorWindow(wx.Window):
         if self.GetCapture():
             self.ReleaseMouse()
 
-    def OnMotion(self,evt):
+    def OnMotion(self, evt):
         self._mouseIn = False
         if evt.Dragging() and evt.LeftIsDown():
             self.newPos = (evt.GetX(), evt.GetY())
-            if self.newPos[1]>= 0.0 and self.newPos[1]<= float(self.h):
-                if self.newPos[0]>= 0.0 and self.newPos[0]<= float(self.w):
+            if self.newPos[1] >= 0.0 and self.newPos[1] <= float(self.h):
+                if self.newPos[0] >= 0.0 and self.newPos[0] <= float(self.w):
                     self._mouseIn = True
 
             if self._mouseIn:
@@ -585,8 +585,8 @@ class GraphEditorWindow(wx.Window):
 
         if evt.Dragging() and evt.MiddleIsDown():
             self.newMidPos = (evt.GetX(), evt.GetY())
-            if self.newMidPos[1]>= 0.0 and self.newMidPos[1]<= float(self.h):
-                if self.newMidPos[0]>= 0.0 and self.newMidPos[0]<= float(self.w):
+            if self.newMidPos[1] >= 0.0 and self.newMidPos[1] <= float(self.h):
+                if self.newMidPos[0] >= 0.0 and self.newMidPos[0] <= float(self.w):
                     self._mouseIn = True
 
             if self._mouseIn:
@@ -656,23 +656,23 @@ class GraphEditorWindow(wx.Window):
             self.setNewKey(list)
 
     def inside(self, point0, point1, point):
-        if point0[0]<=point1[0] and point0[1]<=point1[1]:
-            if point0[0]<point[0] and point[0]<point1[0] and point0[1]<point[1] and point[1]<point1[1]:
+        if point0[0] <= point1[0] and point0[1] <= point1[1]:
+            if point0[0] < point[0] and point[0] < point1[0] and point0[1] < point[1] and point[1] < point1[1]:
                 return True
             else:
                 return False
-        elif point1[0]<=point0[0] and point0[1]<=point1[1]:
-            if point1[0]<point[0] and point[0]<point0[0] and point0[1]<point[1] and point[1]<point1[1]:
+        elif point1[0] <= point0[0] and point0[1] <= point1[1]:
+            if point1[0] < point[0] and point[0] < point0[0] and point0[1] < point[1] and point[1] < point1[1]:
                 return True
             else:
                 return False
-        elif point0[0]<=point1[0] and point1[1]<=point0[1]:
-            if point0[0]<point[0] and point[0]<point1[0] and point1[1]<point[1] and point[1]<point0[1]:
+        elif point0[0] <= point1[0] and point1[1] <= point0[1]:
+            if point0[0] < point[0] and point[0] < point1[0] and point1[1] < point[1] and point[1] < point0[1]:
                 return True
             else:
                 return False
-        elif point1[0]<=point0[0] and point1[1]<=point0[1]:
-            if point1[0]<point[0] and point[0]<point0[0] and point1[1]<point[1] and point[1]<point0[1]:
+        elif point1[0] <= point0[0] and point1[1] <= point0[1]:
+            if point1[0] < point[0] and point[0] < point0[0] and point1[1] < point[1] and point[1] < point0[1]:
                 return True
             else:
                 return False
@@ -713,7 +713,7 @@ class GraphEditorWindow(wx.Window):
                     self._mainDialog.editor.animMgr.keyFramesInfo[list[i][AG.KEY]][list[i][AG.I]][AG.INSLOPE][0] = newSlope[0]/self.unitWidth
                     self._mainDialog.editor.animMgr.keyFramesInfo[list[i][AG.KEY]][list[i][AG.I]][AG.INSLOPE][1] = newSlope[1]/self.unitHeight
                     handler = self.generateHandler(self._mainDialog.editor.animMgr.keyFramesInfo[list[i][AG.KEY]][list[i][AG.I]])
-                    if handler[1][0][0]>= list[i][AG.KEYFRAME][AG.LOCAL_VALUE][0]:
+                    if handler[1][0][0] >= list[i][AG.KEYFRAME][AG.LOCAL_VALUE][0]:
                         self._mainDialog.editor.animMgr.keyFramesInfo[list[i][AG.KEY]][list[i][AG.I]][AG.INSLOPE][0] = temp0
                         self._mainDialog.editor.animMgr.keyFramesInfo[list[i][AG.KEY]][list[i][AG.I]][AG.INSLOPE][1] = temp1
                         return
@@ -872,25 +872,25 @@ class GraphEditorUI(wx.Dialog):
             self.graphEditorWindow.refresh()
             self.graphEditorWindow.SetGraphEditorData(self.str, self.curFrame)
 
-    def OnZoomIn(self,evt):
+    def OnZoomIn(self, evt):
         self.graphEditorWindow.zoom = self.graphEditorWindow.zoom/float(1.2)
         self.graphEditorWindow.unitWidth = self.graphEditorWindow.unitWidth*float(1.2)
         self.graphEditorWindow.unitHeight = self.graphEditorWindow.unitHeight*float(1.2)
         self.graphEditorWindow.generateInfo()
         self.graphEditorWindow.SetGraphEditorData(self.str, self.curFrame)
 
-    def OnZoomOut(self,evt):
+    def OnZoomOut(self, evt):
         self.graphEditorWindow.zoom = self.graphEditorWindow.zoom*float(1.2)
         self.graphEditorWindow.unitWidth = self.graphEditorWindow.unitWidth/float(1.2)
         self.graphEditorWindow.unitHeight = self.graphEditorWindow.unitHeight/float(1.2)
         self.graphEditorWindow.generateInfo()
         self.graphEditorWindow.SetGraphEditorData(self.str, self.curFrame)
 
-    def OnOneTangent(self,evt):
+    def OnOneTangent(self, evt):
         self.graphEditorWindow._OneTangent = True
         self.graphEditorWindow.SetGraphEditorData(self.str, self.curFrame)
 
-    def OnTwoTangents(self,evt):
+    def OnTwoTangents(self, evt):
         self.graphEditorWindow._OneTangent = False
         self.graphEditorWindow.SetGraphEditorData(self.str, self.curFrame)
 
@@ -901,7 +901,7 @@ class GraphEditorUI(wx.Dialog):
         else:
             pass
 
-    def OnExit(self,evt):
+    def OnExit(self, evt):
         self.Destroy()
         self.editor.ui.graphEditorMenuItem.Check(False)
         self.object = None

+ 8 - 4
direct/src/leveleditor/LevelEditorUIBase.py

@@ -646,17 +646,21 @@ class ViewportMenu(wx.Menu):
         wx.Menu.__init__(self)
 
     def addItem(self, name, parent = None, call = None, id = None):
-        if id is None: id = wx.NewId()
-        if parent is None: parent = self
+        if id is None:
+            id = wx.NewId()
+        if parent is None:
+            parent = self
         item = wx.MenuItem(parent, id, name)
         parent.AppendItem(item)
         if call is not None:
             self.Bind(wx.EVT_MENU, call, item)
 
     def addMenu(self, name, parent = None, id = None):
-        if id is None: id = wx.NewId()
+        if id is None:
+            id = wx.NewId()
         subMenu = wx.Menu()
-        if parent is None: parent = self
+        if parent is None:
+            parent = self
         parent.AppendMenu(id, name, subMenu)
         return subMenu
 

+ 4 - 4
direct/src/leveleditor/ObjectMgrBase.py

@@ -48,7 +48,7 @@ class ObjectMgrBase:
         for id in list(self.objects.keys()):
             try:
                 self.objects[id][OG.OBJ_NP].removeNode()
-            except:
+            except Exception:
                 pass
             del self.objects[id]
 
@@ -209,7 +209,7 @@ class ObjectMgrBase:
                         model = objDef.model
                     try:
                         newobj = Actor(model)
-                    except:
+                    except Exception:
                         newobj = Actor(Filename.fromOsSpecific(model).getFullpath())
                     if hasattr(objDef, 'animDict') and objDef.animDict != {}:
                         objDef.anims = objDef.animDict.get(model)
@@ -220,7 +220,7 @@ class ObjectMgrBase:
                         model = objDef.model
                     try:
                         newobjModel = base.loader.loadModel(model)
-                    except:
+                    except Exception:
                         newobjModel = base.loader.loadModel(Filename.fromOsSpecific(model).getFullpath(), okMissing=True)
                     if newobjModel:
                         self.flatten(newobjModel, model, objDef, uid)
@@ -511,7 +511,7 @@ class ObjectMgrBase:
             if objDef.actor:
                 try:
                     newobj = Actor(model)
-                except:
+                except Exception:
                     newobj = Actor(Filename.fromOsSpecific(model).getFullpath())
             else:
                 newobjModel = base.loader.loadModel(model, okMissing=True)

+ 2 - 2
direct/src/leveleditor/ProtoObjsUI.py

@@ -117,9 +117,9 @@ class ProtoObjsUI(wx.Panel):
             if name.upper().endswith(ext.upper()):
                 try:
                     index = self.llist.InsertStringItem(self.llist.GetItemCount(), name)
-                    self.protoObjs.data[name]= filename
+                    self.protoObjs.data[name] = filename
                     self.addObj(filename)
-                except:
+                except Exception:
                     pass
                 break
 

+ 2 - 2
direct/src/showbase/ContainerLeakDetector.py

@@ -376,8 +376,8 @@ class FindContainers(Job):
         # framerate, etc. See LeakDetectors.py
         if not hasattr(builtins, "leakDetectors"):
             builtins.leakDetectors = {}
-        ref = ObjectRef(Indirection(evalStr='leakDetectors'), id(leakDetectors))
-        self._id2baseStartRef[id(leakDetectors)] = ref
+        ref = ObjectRef(Indirection(evalStr='leakDetectors'), id(builtins.leakDetectors))
+        self._id2baseStartRef[id(builtins.leakDetectors)] = ref
         for i in self._addContainerGen(builtins.__dict__, ref):
             pass
         try:

+ 3 - 3
direct/src/showbase/LeakDetectors.py

@@ -21,11 +21,11 @@ class LeakDetector:
             builtins.leakDetectors = {}
         self._leakDetectorsKey = self.getLeakDetectorKey()
         if __dev__:
-            assert self._leakDetectorsKey not in leakDetectors
-        leakDetectors[self._leakDetectorsKey] = self
+            assert self._leakDetectorsKey not in builtins.leakDetectors
+        builtins.leakDetectors[self._leakDetectorsKey] = self
 
     def destroy(self):
-        del leakDetectors[self._leakDetectorsKey]
+        del builtins.leakDetectors[self._leakDetectorsKey]
 
     def getLeakDetectorKey(self):
         # this string will be shown to the end user and should ideally contain enough information to

+ 5 - 5
direct/src/showbase/Loader.py

@@ -437,9 +437,9 @@ class Loader(DirectObject):
         assert len(modelList) == len(nodeList)
 
         # Make sure we have PandaNodes, not NodePaths.
-        for i in range(len(nodeList)):
-            if isinstance(nodeList[i], NodePath):
-                nodeList[i] = nodeList[i].node()
+        for i, node in enumerate(nodeList):
+            if isinstance(node, NodePath):
+                nodeList[i] = node.node()
 
         # From here on, we deal with a list of (filename, node) pairs.
         modelList = list(zip(modelList, nodeList))
@@ -1091,10 +1091,10 @@ class Loader(DirectObject):
         drop in the new models. """
         self.notify.debug("asyncFlattenDone: %s" % (models,))
         assert len(models) == len(origModelList)
-        for i in range(len(models)):
+        for i, model in enumerate(models):
             origModelList[i].getChildren().detach()
             orig = origModelList[i].node()
-            flat = models[i].node()
+            flat = model.node()
             orig.copyAllProperties(flat)
             flat.replaceNode(orig)
 

+ 17 - 15
direct/src/showbase/PythonUtil.py

@@ -88,7 +88,7 @@ class Functor:
         for arg in self._args:
             try:
                 argStr = repr(arg)
-            except:
+            except Exception:
                 argStr = 'bad repr: %s' % arg.__class__
             s += ', %s' % argStr
         for karg, value in list(self._kargs.items()):
@@ -307,8 +307,10 @@ def difference(a, b):
     """
     difference(list, list):
     """
-    if not a: return b
-    if not b: return a
+    if not a:
+        return b
+    if not b:
+        return a
     d = []
     for i in a:
         if (i not in b) and (i not in d):
@@ -626,7 +628,7 @@ if __debug__:
         # allow profiling in published versions
         #try:
         #    null = not __dev__
-        #except:
+        #except Exception:
         #    null = not __debug__
         #if null:
         #    # if we're not in __dev__, just return the function itself. This
@@ -1006,7 +1008,7 @@ if __debug__:
             finally:
                 del stack
                 del frame
-        except:
+        except Exception:
             result = (None, None, None)
 
         return result
@@ -1322,7 +1324,7 @@ def safeRepr(obj):
 
     try:
         return repr(obj)
-    except:
+    except Exception:
         return '<** FAILED REPR OF %s instance at %s **>' % (obj.__class__.__name__, hex(id(obj)))
 
 def safeReprTypeOnFail(obj):
@@ -1339,7 +1341,7 @@ def safeReprTypeOnFail(obj):
 
     try:
         return repr(obj)
-    except:
+    except Exception:
         return '<** FAILED REPR OF %s instance at %s **>' % (obj.__class__.__name__, hex(id(obj)))
 
 
@@ -1401,7 +1403,7 @@ def fastRepr(obj, maxLen=200, strFactor=10, _visitedIds=None):
             if len(r) > maxLen:
                 r = r[:maxLen]
             return r
-    except:
+    except Exception:
         return '<** FAILED REPR OF %s **>' % obj.__class__.__name__
 
 def convertTree(objTree, idList):
@@ -1819,7 +1821,7 @@ def pstatcollect(scope, level = None):
                 scope.stop(pop = True)
                 return val
             return wrap
-    except:
+    except Exception:
         pass
 
     return decorator
@@ -2007,13 +2009,13 @@ def report(types = [], prefix = '', xform = None, notifyFunc = None, dConfigPara
 def getBase():
     try:
         return base
-    except:
+    except Exception:
         return simbase
 
 def getRepository():
     try:
         return base.cr
-    except:
+    except Exception:
         return simbase.air
 
 exceptionLoggedNotify = None
@@ -2029,7 +2031,7 @@ if __debug__:
         """
         try:
             null = not __dev__
-        except:
+        except Exception:
             null = not __debug__
         if null:
             # if we're not in __dev__, just return the function itself. This
@@ -2061,7 +2063,7 @@ if __debug__:
                             appendStr(e, '\n%s' % s)
                         else:
                             exceptionLoggedNotify.info(s)
-                    except:
+                    except Exception:
                         exceptionLoggedNotify.info(
                             '%s: ERROR IN PRINTING' % f.__name__)
                     raise
@@ -2426,11 +2428,11 @@ def typeName(o):
 def safeTypeName(o):
     try:
         return typeName(o)
-    except:
+    except Exception:
         pass
     try:
         return type(o)
-    except:
+    except Exception:
         pass
     return '<failed safeTypeName()>'
 

+ 2 - 2
direct/src/showbase/ShowBase.py

@@ -704,7 +704,7 @@ class ShowBase(DirectObject.DirectObject):
 
         try:
             self.direct.panel.destroy()
-        except:
+        except Exception:
             pass
 
         if hasattr(self, 'win'):
@@ -2697,7 +2697,7 @@ class ShowBase(DirectObject.DirectObject):
             self.bboard.post('oobeEnabled', True)
             try:
                 cameraParent = localAvatar
-            except:
+            except NameError:
                 # Make oobeCamera be a sibling of wherever camera is now.
                 cameraParent = self.camera.getParent()
             self.oobeCamera.reparentTo(cameraParent)

+ 2 - 1
direct/src/showbase/TaskThreaded.py

@@ -46,7 +46,8 @@ class TaskThreaded:
         self.ignoreAll()
 
     def getTimeslice(self):
-        return self.___timeslice
+        return self.__timeslice
+
     def setTimeslice(self, timeslice):
         self.__timeslice = timeslice
 

+ 1 - 1
direct/src/tkpanels/Inspector.py

@@ -219,7 +219,7 @@ class SequenceInspector(Inspector):
         if partNumber == 0:
             return self.object
         index = self.privatePartNumber(partNumber)
-        if type(index) == IntType:
+        if isinstance(index, int):
             return self.object[index]
         else:
             return getattr(self.object, index)

+ 1 - 1
direct/src/tkpanels/NotifyPanel.py

@@ -15,7 +15,7 @@ class NotifyPanel:
         # Make sure TK mainloop is running
         from direct.showbase.TkGlobal import Pmw
         from tkinter import Toplevel, Frame, Label, Radiobutton, IntVar
-        from direct.showbase.TkGlobal import HORIZONTAL, X, W, NW, BOTH, LEFT, RIGHT
+        from tkinter import HORIZONTAL, X, W, NW, BOTH, LEFT, RIGHT
         # To get severity levels
         from panda3d.core import NSFatal, NSError, NSWarning, NSInfo, NSDebug, NSSpam
 

+ 5 - 7
direct/src/tkwidgets/Floater.py

@@ -344,19 +344,17 @@ if __name__ == '__main__':
     mega1 = Floater(root, command = printVal)
     mega1.pack(side = 'left', expand = 1, fill = 'x')
 
-    """
     # These are things you can set/configure
     # Starting value for floater
-    mega1['value'] = 123.456
-    mega1['text'] = 'Drive delta X'
+    #mega1['value'] = 123.456
+    #mega1['text'] = 'Drive delta X'
     # To change the color of the label:
-    mega1.label['foreground'] = 'Red'
+    #mega1.label['foreground'] = 'Red'
     # Max change/update, default is 100
     # To have really fine control, for example
-    # mega1['maxVelocity'] = 0.1
+    #mega1['maxVelocity'] = 0.1
     # Number of digits to the right of the decimal point, default = 2
-    # mega1['numDigits'] = 5
-    """
+    #mega1['numDigits'] = 5
 
     # To create a floater group to set an RGBA value:
     group1 = FloaterGroup(root, dim = 4,

+ 1 - 1
direct/src/tkwidgets/MemoryExplorer.py

@@ -343,7 +343,7 @@ class MemoryExplorerItem:
             self.numFaces += child.numFaces
 
     def ls(self, indent = ""):
-        print(indent + self.nodePath.getName() + " " + str(self.vertexBytes) + " " + str(self.numFaces) + " " + str(self.textureBytes))
+        print(indent + self.nodePath.getName() + " " + str(self.getVertexBytes()) + " " + str(self.numFaces) + " " + str(self.textureBytes))
         indent = indent +  " "
 
         for child in self.children:

+ 0 - 6
direct/src/tkwidgets/VectorWidgets.py

@@ -115,18 +115,12 @@ class VectorEntry(Pmw.MegaWidget):
         # Make sure input variables processed
         self.initialiseoptions(VectorEntry)
 
-    def menu(self):
-        return self.menu
-
     def label(self):
         return self._label
 
     def entry(self, index):
         return self.entryList[index]
 
-    def entryList(self):
-        return self.entryList
-
     def floaters(self):
         return self._floaters
 

+ 1 - 2
direct/src/tkwidgets/WidgetPropertiesDialog.py

@@ -24,8 +24,7 @@ class WidgetPropertiesDialog(tk.Toplevel):
             self.propertyList.sort()
         # Use default parent if none specified
         if not parent:
-            import tkinter
-            parent = tkinter._default_root
+            parent = tk._default_root
         # Create toplevel window
         tk.Toplevel.__init__(self, parent)
         self.transient(parent)