cpython: c96dba33f019 (original) (raw)

Mercurial > cpython

changeset 88341:c96dba33f019

Issue #20144: Argument Clinic now supports simple constants as parameter default values. inspect.Signature correspondingly supports them in __text_signature__ fields for builtins. [#20144]

Larry Hastings larry@hastings.org
date Tue, 07 Jan 2014 11:53:01 -0800
parents e2494137b118
children ddb5cd3e0860
files Lib/inspect.py Lib/test/test_inspect.py Misc/NEWS Modules/_sre.c Modules/_testcapimodule.c Tools/clinic/clinic.py
diffstat 6 files changed, 153 insertions(+), 32 deletions(-)[+] [-] Lib/inspect.py 56 Lib/test/test_inspect.py 13 Misc/NEWS 6 Modules/_sre.c 70 Modules/_testcapimodule.c 12 Tools/clinic/clinic.py 28

line wrap: on

line diff

--- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -1974,18 +1974,60 @@ class Signature: parameters = [] empty = Parameter.empty

+

+

+

+

+

def p(name_node, default_node, default=empty):

-

# non-keyword-only parameters

# *args

--- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -15,6 +15,7 @@ try: from concurrent.futures import ThreadPoolExecutor except ImportError: ThreadPoolExecutor = None +import _testcapi from test.support import run_unittest, TESTFN, DirsOnSysPath from test.support import MISSING_C_DOCSTRINGS @@ -1593,9 +1594,19 @@ class TestSignatureObject(unittest.TestC @unittest.skipIf(MISSING_C_DOCSTRINGS, "Signature information for builtins requires docstrings") def test_signature_on_builtins(self):

+

def test_signature_on_non_function(self): with self.assertRaisesRegex(TypeError, 'is not a callable object'):

--- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,11 +13,17 @@ Core and Builtins Library ------- +- Issue #20144: inspect.Signature now supports parsing simple symbolic

--- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -526,21 +526,58 @@ sre_search(SRE_STATE* state, SRE_CODE* p return sre_ucs4_search(state, pattern); } -static PyObject* -pattern_match(PatternObject* self, PyObject* args, PyObject* kw) +/*[clinic] +module _sre +class _sre.SRE_Pattern + +_sre.SRE_Pattern.match as pattern_match +

+ +Matches zero or more characters at the beginning of the string. +[clinic]*/ + +PyDoc_STRVAR(pattern_match__doc__, +"match(pattern, pos=0, endpos=sys.maxsize)\n" +"Matches zero or more characters at the beginning of the string."); + +#define PATTERN_MATCH_METHODDEF [](#l4.27)

+ +static PyObject * +pattern_match_impl(PatternObject *self, PyObject *pattern, Py_ssize_t pos, Py_ssize_t endpos); + +static PyObject * +pattern_match(PyObject *self, PyObject *args, PyObject *kwargs) +{

+

+ +exit:

+} + +static PyObject * +pattern_match_impl(PatternObject self, PyObject pattern, Py_ssize_t pos, Py_ssize_t endpos) +/[clinic checksum: 63e59c5f3019efe6c1f3acdec42b2d3595e14a09]/ { SRE_STATE state; Py_ssize_t status; -

-

+

@@ -556,7 +593,7 @@ pattern_match(PatternObject* self, PyObj state_fini(&state);

} static PyObject* @@ -1254,10 +1291,6 @@ done: return result; } -PyDoc_STRVAR(pattern_match_doc, -"match(string[, pos[, endpos]]) -> match object or None.\n[](#l4.88)

- PyDoc_STRVAR(pattern_fullmatch_doc, "fullmatch(string[, pos[, endpos]]) -> match object or None.\n[](#l4.92) Matches against all of the string"); @@ -1295,8 +1328,7 @@ PyDoc_STRVAR(pattern_subn_doc, PyDoc_STRVAR(pattern_doc, "Compiled regular expression objects"); static PyMethodDef pattern_methods[] = {

--- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -2869,6 +2869,15 @@ PyDoc_STRVAR(docstring_with_signature_an "This docstring has a valid signature and some extra newlines." ); +PyDoc_STRVAR(docstring_with_signature_with_defaults, +"docstring_with_signature_with_defaults(s='avocado', d=3.14, i=35, c=sys.maxsize, n=None, t=True, f=False)\n" +"\n" +"\n" +"\n" +"This docstring has a valid signature with parameters,\n" +"and the parameters take defaults of varying types." +); + #ifdef WITH_THREAD typedef struct { PyThread_type_lock start_event; @@ -3087,6 +3096,9 @@ static PyMethodDef TestMethods[] = { {"docstring_with_signature_and_extra_newlines", (PyCFunction)test_with_docstring, METH_NOARGS, docstring_with_signature_and_extra_newlines},

#ifdef WITH_THREAD {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O, PyDoc_STR("set_error_class(error_class) -> None")},

--- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -1362,15 +1362,15 @@ class CConverter(metaclass=CConverterAut # Only used by format units ending with '#'. length = False

if default is not unspecified: self.default = default

@@ -2315,18 +2315,36 @@ class DSLParser: function_args = module.body[0].args parameter = function_args.args[0]

+

+ if function_args.defaults: expr = function_args.defaults[0] # mild hack: explicitly support NULL as a default value if isinstance(expr, ast.Name) and expr.id == 'NULL': value = NULL