in library/builtins.py [0:0]
def _complex_str_parts(s): # noqa: C901
# This function is based on PyPy's _split_complex function in
# complexobject.py
slen = len(s)
if slen == 0:
raise ValueError
realstart = 0
realstop = 0
imagstart = 0
imagstop = 0
imagsign = " "
i = 0
# ignore whitespace at beginning and end
while i < slen and s[i] == " ":
i += 1
while slen > 0 and s[slen - 1] == " ":
slen -= 1
# if it's all whitespace, raise
if i >= slen:
raise ValueError
if s[i] == "(" and s[slen - 1] == ")":
i += 1
slen -= 1
# ignore whitespace after bracket
while i < slen and s[i] == " ":
i += 1
while slen > 0 and s[slen - 1] == " ":
slen -= 1
# extract first number
realstart = i
pc = s[i]
while i < slen and s[i] != " ":
if s[i] in ("+", "-") and pc not in ("e", "E") and i != realstart:
break
pc = s[i]
i += 1
realstop = i
# return appropriate strings is only one number is there
if i >= slen:
newstop = realstop - 1
if newstop < 0:
raise ValueError
if s[newstop] in ("j", "J"):
if realstart == newstop:
imagpart = "1.0"
elif realstart == newstop - 1 and s[realstart] == "+":
imagpart = "1.0"
elif realstart == newstop - 1 and s[realstart] == "-":
imagpart = "-1.0"
else:
imagpart = s[realstart:newstop]
return "0.0", imagpart
else:
return s[realstart:realstop], "0.0"
# find sign for imaginary part
if s[i] == "-" or s[i] == "+":
imagsign = s[i]
else:
raise ValueError
i += 1
if i >= slen:
raise ValueError
imagstart = i
pc = s[i]
while i < slen and s[i] != " ":
if s[i] in ("+", "-") and pc not in ("e", "E"):
break
pc = s[i]
i += 1
imagstop = i - 1
if imagstop < 0:
raise ValueError
if s[imagstop] not in ("j", "J"):
raise ValueError
if imagstop < imagstart:
raise ValueError
if i < slen:
raise ValueError
realpart = s[realstart:realstop]
if imagstart == imagstop:
imagpart = "1.0"
else:
imagpart = s[imagstart:imagstop]
if imagsign == "-":
imagpart = imagsign + imagpart
return realpart, imagpart