NameError: имя 'PI' не определено? - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь создать функцию Formula (), которая принимает в качестве аргумента формулу алгебры c (которая использует синтаксис Python) и возвращает новый класс. Конструктор этого класса принимает в качестве аргумента строку пар переменная = значение, разделенных запятыми. Наконец, у класса есть метод cal c (), который оценивает его формулу, используя заданные значения переменных, и печатает результат.
Проблема здесь, она будет работать:

triangle_hypotenuse = Formula('(a*a + b*b)**0.5')
print(triangle_hypotenuse('a=3, b=4') .calc())

, но когда я пытаюсь :

cylinder_volume = Formula('PI * r**2 * h')
cylinder_volume('r= 1, h=2') .calc()

Я получаю ошибку NameError: имя 'PI' не определено как я могу сделать так, чтобы оно ссылалось на число пи из математического модуля?

Вот мой полный код

import math
from math import pi,cos,sin,tan,atan

# eval('a + sin(p/2)', bindings)    # 'sin' not defined

def Formula(expression):
    class F:

        def __init__(self,kwargs):
            s = kwargs.replace(',','')
            l=((s.replace('=',' ').split()))

            it = iter(l)

            self.res_dct = dict(zip(it,it))
            self.res_dct=  {k:float(v) for k, v in self.res_dct.items()}

            class Foo:
                def setAllWithKwArgs(self, **kwargs):
                    for key, value in kwargs.items():
                        setattr(self, key, value)

        def calc(self):

            return eval(expression,self.res_dct)

    return F

triangle_hypotenuse = Formula('(a*a + b*b)**0.5')
print(triangle_hypotenuse('a=3, b=4') .calc())

cylinder_volume = Formula('PI * r**2 * h')
cylinder_volume('r= 1, h=2') .calc()

Ответы [ 3 ]

1 голос
/ 26 апреля 2020

eval занимает глобальные и локальные, и вы перезаписали глобальные. Кроме того, у вас есть PI в неправильном случае. Попробуйте следующее.

def calc(self):
    return eval(expression.lower(), globals(), self.res_dct)
0 голосов
/ 26 апреля 2020

вы делаете eval для строки, поэтому вы делаете математику для строки, а pi не определено

0 голосов
/ 26 апреля 2020

Я думаю, что вы должны написать пи как пи ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...