1
0
mirror of https://github.com/openSUSE/osc.git synced 2025-01-26 22:56:15 +01:00

python3 compatibility: funcattrs, methodattrs

the introspection names changed a lot in python3, so lets have two
implementations used by respective runtime
This commit is contained in:
Michal Vyskocil 2013-04-09 11:30:03 +02:00 committed by Adrian Schröter
parent 600a565428
commit a134074417

View File

@ -42,10 +42,37 @@ import os
import re import re
import cmd import cmd
import optparse import optparse
import sys
from pprint import pprint from pprint import pprint
from datetime import date from datetime import date
# this is python 2.x style
def introspect_handler_2(handler):
# Extract the introspection bits we need.
func = handler.im_func
if func.func_defaults:
func_defaults = func.func_defaults
else:
func_defaults = []
return \
func_defaults, \
func.func_code.co_argcount, \
func.func_code.co_varnames, \
func.func_code.co_flags, \
func
def introspect_handler_3(handler):
return \
list(handler.__defaults__), \
handler.__code__.co_argcount, \
handler.__code__.co_varnames, \
handler.__code__.co_flags, \
handler.__func__
if sys.version_info[0] == 2:
introspect_handler = introspect_handler_2
else:
introspect_handler = introspect_handler_3
#---- globals #---- globals
@ -806,15 +833,7 @@ class RawCmdln(cmd.Cmd):
indent, indent_width = _get_indent(marker, help) indent, indent_width = _get_indent(marker, help)
suffix = _get_trailing_whitespace(marker, help) suffix = _get_trailing_whitespace(marker, help)
# Extract the introspection bits we need. func_defaults, co_argcount, co_varnames, co_flags, _ = introspect_handler(handler)
func = handler.im_func
if func.func_defaults:
func_defaults = list(func.func_defaults)
else:
func_defaults = []
co_argcount = func.func_code.co_argcount
co_varnames = func.func_code.co_varnames
co_flags = func.func_code.co_flags
CO_FLAGS_ARGS = 4 CO_FLAGS_ARGS = 4
CO_FLAGS_KWARGS = 8 CO_FLAGS_KWARGS = 8
@ -839,7 +858,7 @@ class RawCmdln(cmd.Cmd):
warnings.warn("argument '**%s' on '%s.%s' command " warnings.warn("argument '**%s' on '%s.%s' command "
"handler will never get values" "handler will never get values"
% (name, self.__class__.__name__, % (name, self.__class__.__name__,
func.func_name)) getattr(func, "__name__", getattr(func, "func_name"))))
if co_flags & CO_FLAGS_ARGS: if co_flags & CO_FLAGS_ARGS:
name = argnames.pop(-1) name = argnames.pop(-1)
tail = "[%s...]" % name.upper() tail = "[%s...]" % name.upper()
@ -1155,14 +1174,14 @@ class Cmdln(RawCmdln):
and an appropriate error message will be raised/printed if the and an appropriate error message will be raised/printed if the
command is called with a different number of args. command is called with a different number of args.
""" """
co_argcount = handler.im_func.func_code.co_argcount co_argcount = introspect_handler(handler)[1]
if co_argcount == 2: # handler ::= do_foo(self, argv) if co_argcount == 2: # handler ::= do_foo(self, argv)
return handler(argv) return handler(argv)
elif co_argcount >= 3: # handler ::= do_foo(self, subcmd, opts, ...) elif co_argcount >= 3: # handler ::= do_foo(self, subcmd, opts, ...)
try: try:
optparser = handler.optparser optparser = handler.optparser
except AttributeError: except AttributeError:
optparser = handler.im_func.optparser = SubCmdOptionParser() optparser = introspect_handler(handler)[4].optparser = SubCmdOptionParser()
assert isinstance(optparser, SubCmdOptionParser) assert isinstance(optparser, SubCmdOptionParser)
optparser.set_cmdln_info(self, argv[0]) optparser.set_cmdln_info(self, argv[0])
try: try: