LINUX.ORG.RU

python3 sqrt не понял, что происходит

 ,


0

1

Всем привет,

Cкрипт работает и превращает <sqrt(2.)*a> в sqrt(2.)*7 затем вызывает sqrt(2.)*7 и возвращает значение.

Попробовал поиграться

$python3
>>> sqrt(2.)*7
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'sqrt' is not defined

>>> from math import sqrt
>>> sqrt(2.)*7
9.899494936611665

Добавил в скрипт

from math import sqrt

ошибка осталась

******* ERROR ********
Line 27 in par.pre.fbd

swep p4 p5 tra <sqrt(2.)*a> 0 0 2

'NoneType' object is not callable

Что ещё можно сделать?



Последнее исправление: saufesma (всего исправлений: 1)
Ответ на: комментарий от Virtuos86

Код не мой, может проще самому вручную сделать то для чего код написан.

#!/usr/bin/env python3
"""
This script searches for strings in
angle brackets <...>
If the string is an assignment (e.g. "a=1"), it is executed.
If the string is an expression (e.g. "a+a"), it is
evaluated and the result is placed instead of the <...> construct.
"""
import sys
import re
import glob
import math <<< добавил

argParamsDict={}

# processing command line arguments, get the
# jobname
if len(sys.argv)==1:
    print( "No filename given.")
    files=glob.glob("par.*")
    if len(files)==1:
        print( "Found", files[0])
        source=files[0]
    else:
        print( "Available par.* files:")
        for f in files:
            print( "  ", f)
        quit()
if len(sys.argv)>1:
    print( "Using file:",sys.argv[1])
    source = sys.argv[1]
    # check if parameter values are given on the command line
    if len(sys.argv)>2:
        argParams=sys.argv[2:]
        #print sys.argParams
        for argParam in argParams:
            key,val=argParam.split("=")
            print( key,val)
            argParamsDict[key]=val
        print( argParamsDict )   
            
# open files
print("Source: "+source)
if source.endswith(".par"):
    target = source[0:-4]
elif source.startswith("par."):
    target = source[4:]
print("Target: "+target)
f = open(source,"r")
fo = open(target,"w")
# context dictionaries for evaluation
# restriction to safe functions based on
# http://lybniz2.sourceforge.net/safeeval.html
from math import *
from math import sqrt ББББББ   ДОБАВИЛ
safe_list = ['acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log',
'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']
#use the list to filter the local namespace
safe_dict = dict([ (k, locals().get(k, None)) for k in safe_list ])
#add any needed builtins back in.
safe_dict['abs'] = abs
safe_dict['int'] = int
l=safe_dict
g={"__builtins__":None}
ln=1 # linenumber for error message
#exec("from math import *",g,l)
for line in f:
    # split line into dead and active strings
    s=re.split(r"<([^>]*)>",line)
    # build the output string
    outline=""
    # iterate over pairs of dead and active strings
    for i in range(0,len(s),2):
        outline=outline+s[i]
        if not i+1==len(s):
            # if an active string is available
            active=s[i+1]
            if active.find("=")!=-1:
                # active string contains assignment
                try:
                    exec(active,g,l)
                    res=active
                    val=str(eval(active[:active.find("=")],g,l))
                    print(active+"  ("+val+")")
                    # check for override by command line
                    key=active.split("=")[0]
                    if key in argParamsDict:
                        exec(key+"="+argParamsDict[key],g,l)
                        print( "  Override by command line: ("+argParamsDict[key]+")")
                        res=key+"="+argParamsDict[key]
                except Exception as ex:
                    #template = "An exception of type {0} occured. Arguments:\n{1!r}"
                    #print template.format(type(ex).__name__, ex.args)
                    print( "******* ERROR ********")
                    print( "Line "+str(ln)+" in "+source+"\n")
                    print( line)
                    print( ex.args[0])
                    if type(ex).__name__=="NameError":
                        print( "Hint: Use <name=value> to define names.")
                    exit()
            else:
                # active string is an expression
                try:
                    res=str(eval(active,g,l))
                except Exception as ex:
                    #template = "An exception of type {0} occured. Arguments:\n{1!r}"
                    #print template.format(type(ex).__name__, ex.args)
                    print( "******* ERROR ********")
                    print( "Line "+str(ln)+" in "+source+"\n")
                    print( line)
                    print( ex.args[0])
                    if type(ex).__name__=="NameError":
                        print( "Hint: Use <name=value> to define names.")
                    exit()
            outline=outline+res
    fo.write(outline)
    ln=ln+1
fo.close()
f.close()
saufesma
() автор топика
Ответ на: комментарий от saufesma

А что оно делать то должно?

Если хочется че то вычислить eval-ом, дык и вычисляйте себе на здоровье в своем словаре или math.__dict__ как глобальном словаре.

Совершенно непонятно напуркуа Вам столько букофф для такой тривиальной задачи, за этим толстым текстом ничего невидно же…

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от saufesma

Код не мой, может проще самому вручную сделать то для чего код написан.

Код жесть. Глаза вытекают и плачут кровавыми слезами. Найди автора и заставь его съесть прочитать Python Tutorial хотя бы.

emorozov
()
Ответ на: комментарий от saufesma

Забористое дерьмо. Как я понял, с проблемой уже разобрались.

Кстати, непонятно, откуда ошибка, если она возникает в ветке `else` (`res=str(eval(active,g,l))`), где `l=safe_dict`, а значит, вот тут `safe_dict = dict([ (k, locals().get(k, None)) for k in safe_list ])` в ключ словаря 'sqrt' попадает None. Но как, если выше ```python from math import * from math import sqrt ```

Загадка...

Upd.: как же меня заколебала эта путаница с лоркодом и мракдауном. Почему я опять не могу отредактировать сообщение, как надо? Выставил маркдаун по дефолту, оно форматирует всё равно будто это лоркод, т.е. не форматирует вообще.

Virtuos86 ★★★★★
()
Последнее исправление: Virtuos86 (всего исправлений: 2)
Ответ на: комментарий от Virtuos86

Тоже хорошо пополнили копилку знаний.

Upd.: как же меня заколебала эта путаница с лоркодом и мракдауном

Я как то умудрился поставить дефолтом Lorcode для себя. Правда сегодня тоже что то выпендривался не форматировал нормально.

saufesma
() автор топика
Последнее исправление: saufesma (всего исправлений: 1)
Ответ на: комментарий от saufesma

Единственная (но достаточная) проблема тут в том, что ошибка происходит в искусственно генерируемом коде, выполняемом в искусственном же окружении. Впрочем, я бы не стал ругать автора кода — он оставил достаточно информации относительно того, что делает его скрипт.

Virtuos86 ★★★★★
()
Ответ на: комментарий от saufesma

Не помню, работают ли eval и exec по-разному во втором и третьем питонах. Это надо доки читать. К тому же сейчас в каких-то дистрах вполне может быть питон 3 по умолчанию за алиасом python скрываться.

Virtuos86 ★★★★★
()