Питхон екец ()

Метода екец () извршава динамички креирани програм, који је или низ или објект кода.

Синтакса exec():

 екец (објекат, глобални, локално становништво)

параметри екец ()

exec() узима три параметра:

  • објект - Или низ или објект кода
  • глобали (опционо) - речник
  • локално становништво (опционално) - објекат за мапирање. Речник је стандардни и често коришћени тип мапирања у Питхону.

Коришћење глобалаца и локалног становништва биће речи касније у чланку.

Повратна вредност из екец ()

exec()не враћа никакву вредност, враћа се None.

Пример 1: Како функционише екец ()?

 program = 'a = 5b=10print("Sum =", a+b)' exec(program)

Оутпут

 Збир = 15

Овде се преноси објектни низ програма exec()који извршава програм. у овом случају изостављени су глобални и локални становници.

Пример 2: Дозволите кориснику да унесе унос

  program = input('Enter a program:') exec(program) 

Оутпут

 Унесите програм: (испис (ставка) за ставку у (1, 2, 3)) 1 2 3

Ако желите да преузмете Питхон код од корисника који дозвољава вишередни код (помоћу ''), можете да користите compile()метод пре употребе exec().

Сазнајте више о цомпиле () методи у Питхону.

Будите опрезни док користите екец ()

Размотрите ситуацију, користите Уник систем (мацОС, Линук итд.) И имате увезени osмодул. Ос модул пружа преносиви начин за коришћење функционалности оперативног система попут читања или писања датотеке.

Ако дозволите корисницима да унесу вредност помоћу exec(input()), корисник може издавати наредбе за промену датотеке или чак брисање свих датотека помоћу наредбе os.system('rm -rf *').

Ако користите exec(input())свој код, било би добро проверити које променљиве и методе корисник може да користи. Помоћу методе дир () можете видети које су променљиве и методе доступне.

 from math import * exec('print(dir())')

Оутпут

('Ин', 'Оут', '_', '__', '___', '__буилтин__', '__буилтинс__', '__наме__', '_дх', '_и', ​​'_и1', '_и2', ' _их ',' _ии ',' _иии ',' _ох ',' _сх ',' ацос ',' ацосх ',' асин ',' асинх ',' атан ',' атан2 ',' атанх ',' цеил ' , 'цописигн', 'цос', 'цосх', 'степени', 'е', 'ерф', 'ерфц', 'екит', 'екп', 'екпм1', 'фабс', 'фацториал', ' спрат ',' фмод ',' фрекп ',' фсум ',' гама ',' гцд ',' гет_ипитхон ',' хипот ',' инф ',' исцлосе ',' исфините ',' исинф ',' иснан ' , 'лдекп', 'лгамма ',' лог ',' лог10 ',' лог1п ',' лог2 ',' модф ',' нан ',' пи ',' пов ',' куит ',' радианс ',' син ',' синх ' , 'скрт', 'тан', 'танх', 'трунц')

Ограничавање употребе доступних метода и променљивих у екец ()

Чешће него не, све доступне методе и променљиве које се користе exec()можда нису потребне, или чак могу имати сигурносну рупу. Употребу ових променљивих и метода можете ограничити прослеђивањем опционих глобалних и локалних параметара (речника) exec()методи.

1. Изостављени су и глобални и локални параметри

Ако су оба параметра изостављена (као у нашим ранијим примерима), код за који се очекује да ће се извршити exec()извршава се у тренутном опсегу. Доступне променљиве и методе можете проверити помоћу следећег кода:

 екец ('принт (дир ())')

2. Пролазни глобални параметар; Параметар локално становништво је изостављен

Глобални и локални параметри (речници) користе се за глобалне и локалне променљиве. Ако је речник локалног становништва изостављен, подразумевано се користи глобални речник. Значи, глобали ће се користити и за глобалне и за локалне променљиве.

Напомена: Тренутни глобални и локални речник у Питхону можете проверити помоћу уграђених метода глобалс () и лоцал ().

3. Додавање празног речника као глобалног параметра

 from math import * exec('print(dir())', ()) # This code will raise an exception # exec('print(sqrt(9))', ())

Ако проследите празан речник као глобални, само __builtins__су доступни object(првом параметру у екец ()). Иако смо увели математички модул у горе наведени програм, покушај приступа било којој функцији коју пружа математички модул створиће изузетак.

Оутпут

 ('__изграђени__')

Омогућавање одређених метода

 from math import * exec('print(dir())', ('sqrt': sqrt, 'pow': pow)) # object can have sqrt() module exec('print(sqrt(9))', ('sqrt': sqrt, 'pow': pow))

Овде код који извршава екец () такође може имати sqrt()и pow()методе заједно са __builtins__.

Могуће је променити назив методе према вашој жељи.

 from math import * exec('print(dir())', ('squareRoot': sqrt, 'pow': pow)) # object can have squareRoot() module exec('print(squareRoot(9))', ('squareRoot': sqrt, 'pow': pow))

У горњем програму squareRoot()израчунава квадратни корен (слична функција попут sqrt()). Међутим, покушај употребе sqrt()створиће изузетак.

Ограничавање употребе уграђених компоненти

Можете ограничити коришћење __builtins__дајући вредности Noneдо '__builtins__'у речнику ГлобалС.

 екец (објект, ('__буилтинс__': Ниједан)) 

4. Полагање и глобалног и локалног речника

Потребне функције и променљиве можете учинити доступним за употребу прослеђивањем локалног речника. На пример:

 from math import * globalsParameter = ('__builtins__' : None) localsParameter = ('print': print, 'dir': dir) exec('print(dir())', globalsParameter, localsParameter)

Оутпут

 ('дир', 'принт') 

Овде се само две уграђене методе принт () и дир () могу извршити exec()методом.

Важно је напоменути да, exec()извршава код и не враћа никакву вредност (враћа None). Стога не можете користити наредбе ретурн и ииелд изван дефиниција функције.

Занимљиви Чланци...