From 0fef360caf43278c6536e08312a1a0f876581674 Mon Sep 17 00:00:00 2001 From: "S. Mahmudul Hasan" Date: Tue, 3 Oct 2023 13:45:21 -0400 Subject: [PATCH 1/3] Added better string formatting as required by Issue#138 --- python/builtins.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/python/builtins.py b/python/builtins.py index 4abb8187..19193a58 100644 --- a/python/builtins.py +++ b/python/builtins.py @@ -96,13 +96,20 @@ def sorted(iterable, reverse=False, key=None): return a ##### str ##### -def __f(self, *args): +def __f(self, *args, **kwargs): if '{}' in self: for i in range(len(args)): self = self.replace('{}', str(args[i]), 1) else: - for i in range(len(args)): - self = self.replace('{'+str(i)+'}', str(args[i])) + # Positional arguments will be followed by keyword arguments + # 1. Replace the positional arguments + for i,a in enumerate(args): + self = self.replace('{'+str(i)+'}', str(a)) + + # 2. Replace the keyword arguments + for k,v in kwargs.items(): + self = self.replace('{'+k+'}', str(v)) + return self str.format = __f From ee548164218d0f1c22759d6d6cd7ca5e42f297b8 Mon Sep 17 00:00:00 2001 From: "S. Mahmudul Hasan" Date: Thu, 5 Oct 2023 20:04:21 -0400 Subject: [PATCH 2/3] Updated str.format to tokenization-based-replacement operation --- python/builtins.py | 119 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 105 insertions(+), 14 deletions(-) diff --git a/python/builtins.py b/python/builtins.py index 19193a58..1f096cc1 100644 --- a/python/builtins.py +++ b/python/builtins.py @@ -96,21 +96,112 @@ def sorted(iterable, reverse=False, key=None): return a ##### str ##### -def __f(self, *args, **kwargs): - if '{}' in self: - for i in range(len(args)): - self = self.replace('{}', str(args[i]), 1) - else: - # Positional arguments will be followed by keyword arguments - # 1. Replace the positional arguments - for i,a in enumerate(args): - self = self.replace('{'+str(i)+'}', str(a)) - - # 2. Replace the keyword arguments - for k,v in kwargs.items(): - self = self.replace('{'+k+'}', str(v)) +def tokenize(s:str) -> list: + tokens = [] + L, R = 0,0 - return self + mode = None + curPos = 0 + lookingForKword = False + + while(R str: + tokens = tokenize(self) + argMap = {} + for i, a in enumerate(args): + argMap[str(i)] = a + final_tokens = [] + for t in tokens: + if t[0] == '{' and t[-1] == '}': + key = t[1:-1] + argMapVal = argMap.get(key, None) + kwargsVal = kwargs.get(key, None) + + if argMapVal is None and kwargsVal is None: + raise ValueError("No arg found for token: "+t) + elif argMapVal is not None: + final_tokens.append(str(argMapVal)) + else: + final_tokens.append(str(kwargsVal)) + else: + final_tokens.append(t) + + return ''.join(final_tokens) + + # if '{}' in self: + # for i in range(len(args)): + # self = self.replace('{}', str(args[i]), 1) + # else: + # # Positional arguments will be followed by keyword arguments + # # 1. Replace the positional arguments + # for i,a in enumerate(args): + # self = self.replace('{'+str(i)+'}', str(a)) + + # # 2. Replace the keyword arguments + # for k,v in kwargs.items(): + # self = self.replace('{'+k+'}', str(v)) + + # return self str.format = __f def __f(self, chars=None): From 151e9467ae717c0dd9acc4fcfb5adbe24fed3279 Mon Sep 17 00:00:00 2001 From: "S. Mahmudul Hasan" Date: Fri, 6 Oct 2023 16:56:19 -0400 Subject: [PATCH 3/3] fixed the error case for escaped curly braces, and converted the tokenize function into a inner function --- python/builtins.py | 161 +++++++++++++++++++++++++-------------------- 1 file changed, 89 insertions(+), 72 deletions(-) diff --git a/python/builtins.py b/python/builtins.py index 1f096cc1..9528160b 100644 --- a/python/builtins.py +++ b/python/builtins.py @@ -96,77 +96,94 @@ def sorted(iterable, reverse=False, key=None): return a ##### str ##### -def tokenize(s:str) -> list: - tokens = [] - L, R = 0,0 - - mode = None - curPos = 0 - lookingForKword = False - - while(R str: - tokens = tokenize(self) + def tokenizeString(s:str): + tokens = [] + L, R = 0,0 + + mode = None + curArg = 0 + # lookingForKword = False + + while(R str: key = t[1:-1] argMapVal = argMap.get(key, None) kwargsVal = kwargs.get(key, None) - + if argMapVal is None and kwargsVal is None: raise ValueError("No arg found for token: "+t) elif argMapVal is not None: @@ -187,7 +204,7 @@ def __f(self:str, *args, **kwargs) -> str: final_tokens.append(t) return ''.join(final_tokens) - + # if '{}' in self: # for i in range(len(args)): # self = self.replace('{}', str(args[i]), 1)