from the "Alphabetic" property defined in the Unicode Standard.
+.. method:: str.isascii()
+
+ Return true if the string is empty or all characters in the string are ASCII,
+ false otherwise.
+ ASCII characters have code points in the range U+0000-U+007F.
+
+ .. versionadded:: 3.7
+
+
.. method:: str.isdecimal()
Return true if all characters in the string are decimal
False
+.. method:: bytes.isascii()
+ bytearray.isascii()
+
+ Return true if the sequence is empty or all bytes in the sequence are ASCII,
+ false otherwise.
+ ASCII bytes are in the range 0-0x7F.
+
+ .. versionadded:: 3.7
+
+
.. method:: bytes.isdigit()
bytearray.isdigit()
extern PyObject* _Py_bytes_isspace(const char *cptr, Py_ssize_t len);
extern PyObject* _Py_bytes_isalpha(const char *cptr, Py_ssize_t len);
extern PyObject* _Py_bytes_isalnum(const char *cptr, Py_ssize_t len);
+extern PyObject* _Py_bytes_isascii(const char *cptr, Py_ssize_t len);
extern PyObject* _Py_bytes_isdigit(const char *cptr, Py_ssize_t len);
extern PyObject* _Py_bytes_islower(const char *cptr, Py_ssize_t len);
extern PyObject* _Py_bytes_isupper(const char *cptr, Py_ssize_t len);
extern const char _Py_isspace__doc__[];
extern const char _Py_isalpha__doc__[];
extern const char _Py_isalnum__doc__[];
+extern const char _Py_isascii__doc__[];
extern const char _Py_isdigit__doc__[];
extern const char _Py_islower__doc__[];
extern const char _Py_isupper__doc__[];
return self.data.index(sub, start, end)
def isalpha(self): return self.data.isalpha()
def isalnum(self): return self.data.isalnum()
+ def isascii(self): return self.data.isascii()
def isdecimal(self): return self.data.isdecimal()
def isdigit(self): return self.data.isdigit()
def isidentifier(self): return self.data.isidentifier()
self.checkequal(False, 'abc\n', 'isalnum')
self.checkraises(TypeError, 'abc', 'isalnum', 42)
+ def test_isascii(self):
+ self.checkequal(True, '', 'isascii')
+ self.checkequal(True, '\x00', 'isascii')
+ self.checkequal(True, '\x7f', 'isascii')
+ self.checkequal(True, '\x00\x7f', 'isascii')
+ self.checkequal(False, '\x80', 'isascii')
+ self.checkequal(False, '\xe9', 'isascii')
+
def test_isdigit(self):
self.checkequal(False, '', 'isdigit')
self.checkequal(False, 'a', 'isdigit')
>>> import builtins
>>> tests = doctest.DocTestFinder().find(builtins)
- >>> 790 < len(tests) < 810 # approximate number of objects with docstrings
+ >>> 800 < len(tests) < 820 # approximate number of objects with docstrings
True
>>> real_tests = [t for t in tests if len(t.examples) > 0]
>>> len(real_tests) # objects that actually have doctests
self.assertFalse('\U0001F40D'.isalpha())
self.assertFalse('\U0001F46F'.isalpha())
+ def test_isascii(self):
+ super().test_isascii()
+ self.assertFalse("\u20ac".isascii())
+ self.assertFalse("\U0010ffff".isascii())
+
def test_isdecimal(self):
self.checkequalnofix(False, '', 'isdecimal')
self.checkequalnofix(False, 'a', 'isdecimal')
--- /dev/null
+Add ``.isascii()`` method to ``str``, ``bytes`` and ``bytearray``.
+It can be used to test that string contains only ASCII characters.
_Py_isalnum__doc__},
{"isalpha", (PyCFunction)stringlib_isalpha, METH_NOARGS,
_Py_isalpha__doc__},
+ {"isascii", (PyCFunction)stringlib_isascii, METH_NOARGS,
+ _Py_isascii__doc__},
{"isdigit", (PyCFunction)stringlib_isdigit, METH_NOARGS,
_Py_isdigit__doc__},
{"islower", (PyCFunction)stringlib_islower, METH_NOARGS,
}
+PyDoc_STRVAR_shared(_Py_isascii__doc__,
+"B.isascii() -> bool\n\
+\n\
+Return True if B is empty or all characters in B are ASCII,\n\
+False otherwise.");
+
+PyObject*
+_Py_bytes_isascii(const char *cptr, Py_ssize_t len)
+{
+ const unsigned char *p = (unsigned char *) cptr;
+ const unsigned char *e = p + len;
+ for (; p < e; p++) {
+ if (*p >= 128) {
+ Py_RETURN_FALSE;
+ }
+ }
+ Py_RETURN_TRUE;
+}
+
+
PyDoc_STRVAR_shared(_Py_isdigit__doc__,
"B.isdigit() -> bool\n\
\n\
_Py_isalnum__doc__},
{"isalpha", (PyCFunction)stringlib_isalpha, METH_NOARGS,
_Py_isalpha__doc__},
+ {"isascii", (PyCFunction)stringlib_isascii, METH_NOARGS,
+ _Py_isascii__doc__},
{"isdigit", (PyCFunction)stringlib_isdigit, METH_NOARGS,
_Py_isdigit__doc__},
{"islower", (PyCFunction)stringlib_islower, METH_NOARGS,
return return_value;
}
+PyDoc_STRVAR(unicode_isascii__doc__,
+"isascii($self, /)\n"
+"--\n"
+"\n"
+"Return True if all characters in the string are ASCII, False otherwise.\n"
+"\n"
+"ASCII characters have code points in the range U+0000-U+007F.\n"
+"Empty string is ASCII too.");
+
+#define UNICODE_ISASCII_METHODDEF \
+ {"isascii", (PyCFunction)unicode_isascii, METH_NOARGS, unicode_isascii__doc__},
+
+static PyObject *
+unicode_isascii_impl(PyObject *self);
+
+static PyObject *
+unicode_isascii(PyObject *self, PyObject *Py_UNUSED(ignored))
+{
+ return unicode_isascii_impl(self);
+}
+
PyDoc_STRVAR(unicode_islower__doc__,
"islower($self, /)\n"
"--\n"
{
return unicode_sizeof_impl(self);
}
-/*[clinic end generated code: output=1ad4e81b68194264 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=561c88c912b8fe3b input=a9049054013a1b77]*/
return _Py_bytes_isalnum(STRINGLIB_STR(self), STRINGLIB_LEN(self));
}
+static PyObject*
+stringlib_isascii(PyObject *self)
+{
+ return _Py_bytes_isascii(STRINGLIB_STR(self), STRINGLIB_LEN(self));
+}
+
static PyObject*
stringlib_isdigit(PyObject *self)
{
return PyLong_FromSsize_t(result);
}
+/*[clinic input]
+str.isascii as unicode_isascii
+
+Return True if all characters in the string are ASCII, False otherwise.
+
+ASCII characters have code points in the range U+0000-U+007F.
+Empty string is ASCII too.
+[clinic start generated code]*/
+
+static PyObject *
+unicode_isascii_impl(PyObject *self)
+/*[clinic end generated code: output=c5910d64b5a8003f input=5a43cbc6399621d5]*/
+{
+ if (PyUnicode_READY(self) == -1) {
+ return NULL;
+ }
+ return PyBool_FromLong(PyUnicode_IS_ASCII(self));
+}
+
/*[clinic input]
str.islower as unicode_islower
UNICODE_UPPER_METHODDEF
{"startswith", (PyCFunction) unicode_startswith, METH_VARARGS, startswith__doc__},
{"endswith", (PyCFunction) unicode_endswith, METH_VARARGS, endswith__doc__},
+ UNICODE_ISASCII_METHODDEF
UNICODE_ISLOWER_METHODDEF
UNICODE_ISUPPER_METHODDEF
UNICODE_ISTITLE_METHODDEF