Psyduck - 可達鴨 之 鴨力山大2


Server : LiteSpeed
System : Linux premium217.web-hosting.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
User : alloknri ( 880)
PHP Version : 8.1.34
Disable Function : NONE
Directory :  /lib64/python2.7/Tools/scripts/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //lib64/python2.7/Tools/scripts/cleanfuture.py
#! /usr/bin/python2.7

"""cleanfuture [-d][-r][-v] path ...

-d  Dry run.  Analyze, but don't make any changes to, files.
-r  Recurse.  Search for all .py files in subdirectories too.
-v  Verbose.  Print informative msgs.

Search Python (.py) files for future statements, and remove the features
from such statements that are already mandatory in the version of Python
you're using.

Pass one or more file and/or directory paths.  When a directory path, all
.py files within the directory will be examined, and, if the -r option is
given, likewise recursively for subdirectories.

Overwrites files in place, renaming the originals with a .bak extension. If
cleanfuture finds nothing to change, the file is left alone.  If cleanfuture
does change a file, the changed file is a fixed-point (i.e., running
cleanfuture on the resulting .py file won't change it again, at least not
until you try it again with a later Python release).

Limitations:  You can do these things, but this tool won't help you then:

+ A future statement cannot be mixed with any other statement on the same
  physical line (separated by semicolon).

+ A future statement cannot contain an "as" clause.

Example:  Assuming you're using Python 2.2, if a file containing

from __future__ import nested_scopes, generators

is analyzed by cleanfuture, the line is rewritten to

from __future__ import generators

because nested_scopes is no longer optional in 2.2 but generators is.
"""

import __future__
import tokenize
import os
import sys

dryrun  = 0
recurse = 0
verbose = 0

def errprint(*args):
    strings = map(str, args)
    msg = ' '.join(strings)
    if msg[-1:] != '\n':
        msg += '\n'
    sys.stderr.write(msg)

def main():
    import getopt
    global verbose, recurse, dryrun
    try:
        opts, args = getopt.getopt(sys.argv[1:], "drv")
    except getopt.error, msg:
        errprint(msg)
        return
    for o, a in opts:
        if o == '-d':
            dryrun += 1
        elif o == '-r':
            recurse += 1
        elif o == '-v':
            verbose += 1
    if not args:
        errprint("Usage:", __doc__)
        return
    for arg in args:
        check(arg)

def check(file):
    if os.path.isdir(file) and not os.path.islink(file):
        if verbose:
            print "listing directory", file
        names = os.listdir(file)
        for name in names:
            fullname = os.path.join(file, name)
            if ((recurse and os.path.isdir(fullname) and
                 not os.path.islink(fullname))
                or name.lower().endswith(".py")):
                check(fullname)
        return

    if verbose:
        print "checking", file, "...",
    try:
        f = open(file)
    except IOError, msg:
        errprint("%r: I/O Error: %s" % (file, str(msg)))
        return

    ff = FutureFinder(f, file)
    changed = ff.run()
    if changed:
        ff.gettherest()
    f.close()
    if changed:
        if verbose:
            print "changed."
            if dryrun:
                print "But this is a dry run, so leaving it alone."
        for s, e, line in changed:
            print "%r lines %d-%d" % (file, s+1, e+1)
            for i in range(s, e+1):
                print ff.lines[i],
            if line is None:
                print "-- deleted"
            else:
                print "-- change to:"
                print line,
        if not dryrun:
            bak = file + ".bak"
            if os.path.exists(bak):
                os.remove(bak)
            os.rename(file, bak)
            if verbose:
                print "renamed", file, "to", bak
            g = open(file, "w")
            ff.write(g)
            g.close()
            if verbose:
                print "wrote new", file
    else:
        if verbose:
            print "unchanged."

class FutureFinder:

    def __init__(self, f, fname):
        self.f = f
        self.fname = fname
        self.ateof = 0
        self.lines = [] # raw file lines

        # List of (start_index, end_index, new_line) triples.
        self.changed = []

    # Line-getter for tokenize.
    def getline(self):
        if self.ateof:
            return ""
        line = self.f.readline()
        if line == "":
            self.ateof = 1
        else:
            self.lines.append(line)
        return line

    def run(self):
        STRING = tokenize.STRING
        NL = tokenize.NL
        NEWLINE = tokenize.NEWLINE
        COMMENT = tokenize.COMMENT
        NAME = tokenize.NAME
        OP = tokenize.OP

        changed = self.changed
        get = tokenize.generate_tokens(self.getline).next
        type, token, (srow, scol), (erow, ecol), line = get()

        # Chew up initial comments and blank lines (if any).
        while type in (COMMENT, NL, NEWLINE):
            type, token, (srow, scol), (erow, ecol), line = get()

        # Chew up docstring (if any -- and it may be implicitly catenated!).
        while type is STRING:
            type, token, (srow, scol), (erow, ecol), line = get()

        # Analyze the future stmts.
        while 1:
            # Chew up comments and blank lines (if any).
            while type in (COMMENT, NL, NEWLINE):
                type, token, (srow, scol), (erow, ecol), line = get()

            if not (type is NAME and token == "from"):
                break
            startline = srow - 1    # tokenize is one-based
            type, token, (srow, scol), (erow, ecol), line = get()

            if not (type is NAME and token == "__future__"):
                break
            type, token, (srow, scol), (erow, ecol), line = get()

            if not (type is NAME and token == "import"):
                break
            type, token, (srow, scol), (erow, ecol), line = get()

            # Get the list of features.
            features = []
            while type is NAME:
                features.append(token)
                type, token, (srow, scol), (erow, ecol), line = get()

                if not (type is OP and token == ','):
                    break
                type, token, (srow, scol), (erow, ecol), line = get()

            # A trailing comment?
            comment = None
            if type is COMMENT:
                comment = token
                type, token, (srow, scol), (erow, ecol), line = get()

            if type is not NEWLINE:
                errprint("Skipping file %r; can't parse line %d:\n%s" %
                         (self.fname, srow, line))
                return []

            endline = srow - 1

            # Check for obsolete features.
            okfeatures = []
            for f in features:
                object = getattr(__future__, f, None)
                if object is None:
                    # A feature we don't know about yet -- leave it in.
                    # They'll get a compile-time error when they compile
                    # this program, but that's not our job to sort out.
                    okfeatures.append(f)
                else:
                    released = object.getMandatoryRelease()
                    if released is None or released <= sys.version_info:
                        # Withdrawn or obsolete.
                        pass
                    else:
                        okfeatures.append(f)

            # Rewrite the line if at least one future-feature is obsolete.
            if len(okfeatures) < len(features):
                if len(okfeatures) == 0:
                    line = None
                else:
                    line = "from __future__ import "
                    line += ', '.join(okfeatures)
                    if comment is not None:
                        line += ' ' + comment
                    line += '\n'
                changed.append((startline, endline, line))

            # Loop back for more future statements.

        return changed

    def gettherest(self):
        if self.ateof:
            self.therest = ''
        else:
            self.therest = self.f.read()

    def write(self, f):
        changed = self.changed
        assert changed
        # Prevent calling this again.
        self.changed = []
        # Apply changes in reverse order.
        changed.reverse()
        for s, e, line in changed:
            if line is None:
                # pure deletion
                del self.lines[s:e+1]
            else:
                self.lines[s:e+1] = [line]
        f.writelines(self.lines)
        # Copy over the remainder of the file.
        if self.therest:
            f.write(self.therest)

if __name__ == '__main__':
    main()
Name
Size
Permissions
Options
analyze_dxp.py
4.106 KB
-rwxr-xr-x
analyze_dxp.pyc
4.637 KB
-rw-r--r--
analyze_dxp.pyo
4.637 KB
-rw-r--r--
byext.py
3.852 KB
-rwxr-xr-x
byext.pyc
4.415 KB
-rw-r--r--
byext.pyo
4.415 KB
-rw-r--r--
byteyears.py
1.599 KB
-rwxr-xr-x
byteyears.pyc
1.365 KB
-rw-r--r--
byteyears.pyo
1.365 KB
-rw-r--r--
checkappend.py
4.548 KB
-rwxr-xr-x
checkappend.pyc
4.771 KB
-rw-r--r--
checkappend.pyo
4.771 KB
-rw-r--r--
checkpip.py
0.739 KB
-rwxr-xr-x
checkpip.pyc
1.02 KB
-rw-r--r--
checkpip.pyo
1.02 KB
-rw-r--r--
checkpyc.py
1.963 KB
-rwxr-xr-x
checkpyc.pyc
1.93 KB
-rw-r--r--
checkpyc.pyo
1.93 KB
-rw-r--r--
classfix.py
5.813 KB
-rwxr-xr-x
classfix.pyc
4.091 KB
-rw-r--r--
classfix.pyo
4.091 KB
-rw-r--r--
cleanfuture.py
8.376 KB
-rwxr-xr-x
cleanfuture.pyc
7.221 KB
-rw-r--r--
cleanfuture.pyo
7.188 KB
-rw-r--r--
combinerefs.py
4.277 KB
-rwxr-xr-x
combinerefs.pyc
4.156 KB
-rw-r--r--
combinerefs.pyo
4.124 KB
-rw-r--r--
copytime.py
0.647 KB
-rwxr-xr-x
copytime.pyc
0.915 KB
-rw-r--r--
copytime.pyo
0.915 KB
-rw-r--r--
crlf.py
0.596 KB
-rwxr-xr-x
crlf.pyc
0.835 KB
-rw-r--r--
crlf.pyo
0.835 KB
-rw-r--r--
cvsfiles.py
1.744 KB
-rwxr-xr-x
cvsfiles.pyc
2.112 KB
-rw-r--r--
cvsfiles.pyo
2.112 KB
-rw-r--r--
db2pickle.py
3.486 KB
-rwxr-xr-x
db2pickle.pyc
3.415 KB
-rw-r--r--
db2pickle.pyo
3.415 KB
-rw-r--r--
diff.py
2.018 KB
-rwxr-xr-x
diff.pyc
2.33 KB
-rw-r--r--
diff.pyo
2.33 KB
-rw-r--r--
dutree.py
1.577 KB
-rwxr-xr-x
dutree.pyc
2.178 KB
-rw-r--r--
dutree.pyo
2.178 KB
-rw-r--r--
eptags.py
1.448 KB
-rwxr-xr-x
eptags.pyc
1.832 KB
-rw-r--r--
eptags.pyo
1.832 KB
-rw-r--r--
find_recursionlimit.py
3.392 KB
-rwxr-xr-x
find_recursionlimit.pyc
5.54 KB
-rw-r--r--
find_recursionlimit.pyo
5.54 KB
-rw-r--r--
finddiv.py
2.458 KB
-rwxr-xr-x
finddiv.pyc
3.219 KB
-rw-r--r--
finddiv.pyo
3.219 KB
-rw-r--r--
findlinksto.py
1.044 KB
-rwxr-xr-x
findlinksto.pyc
1.392 KB
-rw-r--r--
findlinksto.pyo
1.392 KB
-rw-r--r--
findnocoding.py
2.742 KB
-rwxr-xr-x
findnocoding.pyc
3.126 KB
-rw-r--r--
findnocoding.pyo
3.126 KB
-rw-r--r--
fixcid.py
9.761 KB
-rwxr-xr-x
fixcid.pyc
7.667 KB
-rw-r--r--
fixcid.pyo
7.667 KB
-rw-r--r--
fixdiv.py
13.517 KB
-rwxr-xr-x
fixdiv.pyc
13.524 KB
-rw-r--r--
fixdiv.pyo
13.443 KB
-rw-r--r--
fixheader.py
1.161 KB
-rwxr-xr-x
fixheader.pyc
1.437 KB
-rw-r--r--
fixheader.pyo
1.437 KB
-rw-r--r--
fixnotice.py
2.979 KB
-rwxr-xr-x
fixnotice.pyc
3.418 KB
-rw-r--r--
fixnotice.pyo
3.418 KB
-rw-r--r--
fixps.py
0.872 KB
-rwxr-xr-x
fixps.pyc
0.946 KB
-rw-r--r--
fixps.pyo
0.946 KB
-rw-r--r--
google.py
0.507 KB
-rwxr-xr-x
google.pyc
0.773 KB
-rw-r--r--
google.pyo
0.773 KB
-rw-r--r--
gprof2html.py
2.116 KB
-rwxr-xr-x
gprof2html.pyc
2.224 KB
-rw-r--r--
gprof2html.pyo
2.224 KB
-rw-r--r--
h2py.py
5.813 KB
-rwxr-xr-x
h2py.pyc
4.289 KB
-rw-r--r--
h2py.pyo
4.289 KB
-rw-r--r--
hotshotmain.py
1.448 KB
-rwxr-xr-x
hotshotmain.pyc
1.819 KB
-rw-r--r--
hotshotmain.pyo
1.819 KB
-rw-r--r--
ifdef.py
3.631 KB
-rwxr-xr-x
ifdef.pyc
2.212 KB
-rw-r--r--
ifdef.pyo
2.212 KB
-rw-r--r--
lfcr.py
0.604 KB
-rwxr-xr-x
lfcr.pyc
0.859 KB
-rw-r--r--
lfcr.pyo
0.859 KB
-rw-r--r--
linktree.py
2.367 KB
-rwxr-xr-x
linktree.pyc
1.978 KB
-rw-r--r--
linktree.pyo
1.978 KB
-rw-r--r--
lll.py
0.725 KB
-rwxr-xr-x
lll.pyc
0.92 KB
-rw-r--r--
lll.pyo
0.92 KB
-rw-r--r--
logmerge.py
5.444 KB
-rwxr-xr-x
logmerge.pyc
4.964 KB
-rw-r--r--
logmerge.pyo
4.964 KB
-rw-r--r--
mailerdaemon.py
7.756 KB
-rwxr-xr-x
mailerdaemon.pyc
7.191 KB
-rw-r--r--
mailerdaemon.pyo
7.191 KB
-rw-r--r--
md5sum.py
2.329 KB
-rwxr-xr-x
md5sum.pyc
2.849 KB
-rw-r--r--
md5sum.pyo
2.849 KB
-rw-r--r--
methfix.py
5.334 KB
-rwxr-xr-x
methfix.pyc
4.028 KB
-rw-r--r--
methfix.pyo
4.028 KB
-rw-r--r--
mkreal.py
1.589 KB
-rwxr-xr-x
mkreal.pyc
1.934 KB
-rw-r--r--
mkreal.pyo
1.934 KB
-rw-r--r--
ndiff.py
3.719 KB
-rwxr-xr-x
ndiff.pyc
3.769 KB
-rw-r--r--
ndiff.pyo
3.769 KB
-rw-r--r--
nm2def.py
2.386 KB
-rwxr-xr-x
nm2def.pyc
2.891 KB
-rw-r--r--
nm2def.pyo
2.891 KB
-rw-r--r--
objgraph.py
5.876 KB
-rwxr-xr-x
objgraph.pyc
4.817 KB
-rw-r--r--
objgraph.pyo
4.817 KB
-rw-r--r--
parseentities.py
1.679 KB
-rwxr-xr-x
parseentities.pyc
2.028 KB
-rw-r--r--
parseentities.pyo
2.028 KB
-rw-r--r--
patchcheck.py
7.499 KB
-rwxr-xr-x
patchcheck.pyc
8.914 KB
-rw-r--r--
patchcheck.pyo
8.914 KB
-rw-r--r--
pathfix.py
4.228 KB
-rwxr-xr-x
pathfix.pyc
3.748 KB
-rw-r--r--
pathfix.pyo
3.748 KB
-rw-r--r--
pdeps.py
3.844 KB
-rwxr-xr-x
pdeps.pyc
3.145 KB
-rw-r--r--
pdeps.pyo
3.145 KB
-rw-r--r--
pickle2db.py
3.85 KB
-rwxr-xr-x
pickle2db.pyc
3.729 KB
-rw-r--r--
pickle2db.pyo
3.729 KB
-rw-r--r--
pindent.py
16.768 KB
-rwxr-xr-x
pindent.pyc
11.288 KB
-rw-r--r--
pindent.pyo
11.288 KB
-rw-r--r--
ptags.py
1.195 KB
-rwxr-xr-x
ptags.pyc
1.374 KB
-rw-r--r--
ptags.pyo
1.374 KB
-rw-r--r--
pysource.py
3.756 KB
-rwxr-xr-x
pysource.pyc
3.915 KB
-rw-r--r--
pysource.pyo
3.915 KB
-rw-r--r--
redemo.py
5.656 KB
-rwxr-xr-x
redemo.pyc
5.126 KB
-rw-r--r--
redemo.pyo
5.126 KB
-rw-r--r--
reindent-rst.py
0.271 KB
-rwxr-xr-x
reindent-rst.pyc
0.47 KB
-rw-r--r--
reindent-rst.pyo
0.47 KB
-rw-r--r--
reindent.py
11.149 KB
-rwxr-xr-x
reindent.pyc
9.403 KB
-rw-r--r--
reindent.pyo
9.365 KB
-rw-r--r--
rgrep.py
1.457 KB
-rwxr-xr-x
rgrep.pyc
1.837 KB
-rw-r--r--
rgrep.pyo
1.837 KB
-rw-r--r--
serve.py
1.12 KB
-rwxr-xr-x
serve.pyc
1.56 KB
-rw-r--r--
serve.pyo
1.56 KB
-rw-r--r--
setup.py
0.411 KB
-rw-r--r--
setup.pyc
0.535 KB
-rw-r--r--
setup.pyo
0.535 KB
-rw-r--r--
suff.py
0.606 KB
-rwxr-xr-x
suff.pyc
0.883 KB
-rw-r--r--
suff.pyo
0.883 KB
-rw-r--r--
svneol.py
2.861 KB
-rwxr-xr-x
svneol.pyc
2.836 KB
-rw-r--r--
svneol.pyo
2.759 KB
-rw-r--r--
texcheck.py
9.039 KB
-rw-r--r--
texcheck.pyc
8.18 KB
-rw-r--r--
texcheck.pyo
8.18 KB
-rw-r--r--
texi2html.py
68.188 KB
-rwxr-xr-x
texi2html.pyc
81.37 KB
-rw-r--r--
texi2html.pyo
81.37 KB
-rw-r--r--
treesync.py
5.647 KB
-rwxr-xr-x
treesync.pyc
5.85 KB
-rw-r--r--
treesync.pyo
5.85 KB
-rw-r--r--
untabify.py
1.187 KB
-rwxr-xr-x
untabify.pyc
1.546 KB
-rw-r--r--
untabify.pyo
1.546 KB
-rw-r--r--
which.py
1.592 KB
-rwxr-xr-x
which.pyc
1.594 KB
-rw-r--r--
which.pyo
1.594 KB
-rw-r--r--
win_add2path.py
1.582 KB
-rw-r--r--
win_add2path.pyc
2.021 KB
-rw-r--r--
win_add2path.pyo
2.021 KB
-rw-r--r--
xxci.py
2.731 KB
-rwxr-xr-x
xxci.pyc
3.923 KB
-rw-r--r--
xxci.pyo
3.923 KB
-rw-r--r--