Я работаю над «калькулятором копирования-вставки», который обнаруживает любые математические выражения, скопированные в системный буфер обмена, оценивает их и копирует ответ в буфер обмена, готовый для вставки. Однако, хотя в коде используется функция eval(), меня это не сильно беспокоит, учитывая, что пользователь обычно знает, что он копирует. При этом я хочу найти лучший способ, не создавая препятствий для вычислений (= например, удаляя возможность вычислять умножения или показатели степени).
Вот важные части моего кода:
#! python3
import pyperclip, time
parsedict = {"×": "*",
"÷": "/",
"^": "**"} # Get rid of anything that cannot be evaluated
def stringparse(string): # Remove whitespace and replace unevaluateable objects
a = string
a = a.replace(" ", "")
for i in a:
if i in parsedict.keys():
a = a.replace(i, parsedict[i])
print(a)
return a
def calculate(string):
parsed = stringparse(string)
ans = eval(parsed) # EVIL!!!
print(ans)
pyperclip.copy(str(ans))
def validcheck(string): # Check if the copied item is a math expression
proof = 0
for i in mathproof:
if i in string:
proof += 1
elif "http" in string: #TODO: Create a better way of passing non-math copies
proof = 0
break
if proof != 0:
calculate(string)
def init(): # Ensure previous copies have no effect
current = pyperclip.paste()
new = current
main(current, new)
def main(current, new):
while True:
new = pyperclip.paste()
if new != current:
validcheck(new)
current = new
pass
else:
time.sleep(1.0)
pass
if __name__ == "__main__":
init()
В: Что следует использовать вместо eval() для вычисления ответа?