Как найти функцию по ее имени

5

09 ноября 2005 года

hardcase

4.5K / / 09.08.2005

Цитата:

Originally posted by skf
Общая идея понятна, но мне еще не приходилось так плотно работать с классами в делфи.
Если можешь, разжуй всё попобробнее

Вот рыба. что не понятно, стучи в асю 263-271-807

Код:

type
  TCommand = class
    private
      fCommand: string;
    public
      procedure Execute(const Params: string); virtual; abstract;
      property Command: string read fCommand;
  end;//of class

  TCommandTable = class
    protected
      procedure AddCommand(Cmd: TCommand);
      function FindCommand(const Cmd: string): TCommand;
      procedure DeleteCommands;
    public
      destructor Destroy; override;
      function RegisterCommand(Cmd: TCommand): boolean;
      function ExecuteCommand(const Cmd: string; const Params: string): boolean;
  end;//of class

  //пример команды
  TSimpleCommand = class(TCommand)
    public
      constructor Create;
      procedure Execute(const Params: string); override;
  end;//of class

procedure TCommandTable.Destroy;
  begin
    DeleteCommands;
  end;

procedure TCommandTable.AddCommand(Cmd: TCommand);
  begin
    //добавляем новую команду в таблицу
    //с Cmd.Command находится идентификатор комманды

    //таблицу команд можно организовать как хэш таблицу
    //в Делфи есть специальный класс: THashedStringList
  end;

function TCommandTable.FindCommand(const Cmd: string): TCommand;
  begin
    //осуществляем поиск команды Cmd в таблице и возвращаем
    //как результат
    //если не нашли, то возвращаем nil
  end;

procedure TCommandTable.DeleteCommands;
  begin
    //очищаем таблицу
  end;

function TCommandTable.RegisterCommand(Cmd: TCommand): boolean;
  begin
    if FindCommand(Cmd.Command) then Result:=false
    else begin
        AddCommand(Cmd);
        Result:=true;
    end;
  end;

function TCommandTable.ExecuteCommand(const Cmd, Params: string): boolean;
  var C: TCommand;
  begin
    c:=FindCommand(Cmd);
    if C = nil then Result:=false
    else begin
        C.Execute(Params);
        Result:=true
    end;
  end;

constructor TSimpleCommand.Create;
  begin
    fCommand:=’MyCommandName’;
  end;

procedure TSimpleCommand.Execute(const Params: string);
  begin
    //нужно переопределять этот метод
    //чтобы придать комманде функциональность
  end;

var
  CmdTable: TCommandTable;
  Cmd: TSimpleCommand;

begin
//создаём таблицу команд
  CmdTable:=TCommandTable.Create;
//создаём объект команды
  Cmd:=TSimpleCommand.Create;
  if not CmdTable.RegisterCommand(Cmd) //регистрация провалилась
  then begin
     Cmd.Free;
  end else begin
     CmdTable.ExecuteCommand (‘MyCommandName’, ‘Parameters’ );
  end;
end;

Как выполнить функцию если ее имя содержится в переменной типа string?

Pavel Durmanov's user avatar

Pavel Durmanov

5,6583 золотых знака21 серебряный знак44 бронзовых знака

задан 4 дек 2017 в 14:27

Roman Seliverstov's user avatar

3

Самый безопасный способ это собрать словарь функций:

def func1(text):
    return text

def func2():
    return ""

functions = {'func1':func1, 'func2':func2}

Соответственно вызов будет functions['ваша строка']()

Избегайте использования eval() всегда когда это возможно, и в карйнем случае используйте ast.literal_eval()

ответ дан 4 дек 2017 в 15:01

Vasiliy Rusin's user avatar

1

Зная имя функции можно получить соответствующий объект функции в заданном пространстве имён.

Если имя это глобальная функция в текущем модуле:

f = globals()["имя"]

Затем самый обычный вызов: f(a, b, c)

Если функция из другого модуля, или это метод класса, объекта, итд то достать функцию можно используя getattr():

f = getattr(module, "имя")

Не используйте eval(), exec() без необходимости: это не эффективно и может быть не безопасно (если строка из недоверенного ввода).

ответ дан 4 дек 2017 в 19:41

jfs's user avatar

jfsjfs

51.8k11 золотых знаков107 серебряных знаков306 бронзовых знаков

11

Можно поступить так:

In [1]: def example(value):
   ...:     return value ** 2
   ...:

In [2]: func_name = 'example'

In [3]: eval(func_name)(10)
Out[3]: 100

Подробнее про eval() можно почитать тут.

ответ дан 4 дек 2017 в 14:38

Pavel Durmanov's user avatar

Pavel DurmanovPavel Durmanov

5,6583 золотых знака21 серебряный знак44 бронзовых знака

4

exec использует текущие глобальные и локальные пространства имён для выполнения кода:

exec('print(123)') 
# 123

ответ дан 4 дек 2017 в 18:19

Игорь Игоряныч's user avatar

Игорь ИгорянычИгорь Игоряныч

1,8934 золотых знака12 серебряных знаков27 бронзовых знаков

class A:
    def executor(self, fn_name):
        getattr(self, fn_name)()

def do_something(self):
    print('done')

a = A()
a.executor('do_something')

Всегда старайтесь избегать потенциальную уязвимость в виде выполнения произвольного кода. Ею могут воспользоваться. В данном примере происходит поиск метода по имени и его дальнейший вызов.

ответ дан 31 окт 2021 в 7:03

Maximus's user avatar

0

1 Answer

Sorted by:

Reset to default

3

If you have the function name, just call it?

e.g. if you want to call a function called “foo” then just call:

foo();

if you have the name in a variable, then call:

window[funcName]();

Improve this answer

answered Nov 20, 2009 at 21:12

scunliffe's user avatar

scunliffescunliffe

62.2k25 gold badges125 silver badges161 bronze badges

Add a comment
 | 

Your Answer

Sign up or log in

Sign up using Google

Sign up using Facebook

Sign up using Email and Password

Post as a guest

Name

Email

Required, but never shown

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you’re looking for? Browse other questions tagged

  • javascript

or ask your own question.

Chrome Developer Tools rock, но одна вещь, которую они, похоже, не имеют (что я могу найти), – это способ найти определение функции JavaScript. Это было бы очень удобно для меня, потому что я работаю над сайтом, который включает в себя множество внешних JS файлов. Конечно, grep решает это, но в браузере будет намного лучше. Я имею в виду, браузер должен это знать, так почему бы не разоблачить его? Я ожидал чего-то вроде:

  • Выберите “Осмотреть элемент” со страницы, в которой выделяется строка на вкладке “Элементы”
  • Щелкните правой кнопкой мыши строку и выберите “Перейти к определению функции”
  • Корректный script загружается на вкладку “Сценарии”, и он переходит к определению функции

Во-первых, существует ли эта функциональность, и я просто пропустил ее?

И если это не так, я предполагаю, что это исходит от WebKit, но ничего не может найти для запросов к Инструменту разработчика или WebKit Bugzilla.

22 март 2012, в 20:08

Поделиться

Источник

8 ответов

Предположим, что мы ищем функцию с именем foo:

  • (открыть Chrome dev-tools),
  • Windows: ctrl + shift + F или macOS:
    cmd + optn + F. Это открывает окно для поиска по всем скриптам.
  • установите флажок “Регулярное выражение”,
  • найдите foos*=s*function (ищет foo = function с любым количеством пробелов между этими тремя токенами),
  • нажмите на возвращаемый результат.

Другим вариантом определения функции является functions*foos*( для function foo( с любым количеством пробелов между этими тремя токенами.

plesiv
06 июнь 2012, в 11:21

Поделиться

Этот приземлился в Chrome на 2012-08-26
Не уверен относительно точной версии, я заметил это в Chrome 24.

Снимок экрана стоит миллион слов: Изображение 108449

Я проверяю объект с помощью методов в консоли. Нажатие на “Показать функции определения” приведет меня к месту в исходном коде, где определена функция. Или я могу просто нависать над словом function () {, чтобы увидеть тело функции во всплывающей подсказке. Вы можете легко проверить всю цепочку прототипов, как это! CDT определенно рок!!!

Надеюсь, вам все это станет полезно!

Dmitry Pashkevich
16 янв. 2013, в 11:27

Поделиться

Вы можете распечатать функцию, оценив ее имя в консоли, например

> unknownFunc
function unknownFunc(unknown) {
    alert('unknown seems to be ' + unknown);
}

это не будет работать для встроенных функций, они будут отображать [native code] вместо исходного кода.

EDIT: это означает, что функция определена в текущей области.

joar
22 март 2012, в 20:34

Поделиться

2016 Обновление: в Chrome версии 51.0.2704.103

Существует ярлык ” Go to member (указан в settings > shortcut > Text Editor). Откройте файл, содержащий вашу функцию (в панели sources DevTools) и нажмите:

ctrl + shift + O

или в OS X:

+ shift + O

Это позволяет перечислить и получить доступ к членам текущего файла.

arthur.sw
10 июль 2016, в 16:23

Поделиться

Другим способом навигации по определению определения функции будет разбиение на отладчик где-нибудь, где вы можете получить доступ к этой функции, и ввести полнофункциональное имя функции в консоли. Это напечатает определение функции в консоли и даст ссылку, которая на клике откроет место расположения скрипта, где определена функция.

Изображение 108450

Răzvan Flavius Panda
04 дек. 2013, в 14:36

Поделиться

Различные браузеры делают это по-другому.

  • Сначала откройте окно консоли, щелкнув правой кнопкой мыши на странице и выбрав “Осмотреть элемент” или нажав F12.

  • В консоли введите…

    • Firefox

      functionName.toSource()
      
    • Chrome

      functionName
      

Deepak Dixit
20 нояб. 2015, в 06:38

Поделиться

Я считаю, что самый быстрый способ найти глобальную функцию – это просто:

  1. Выберите вкладку ” Источники “.
  2. В окне ” Наблюдение” нажмите + и введите окно
  3. Ваши глобальные ссылки на функции перечислены первыми, в алфавитном порядке.
  4. Щелкните правой кнопкой мыши интересующую вас функцию.
  5. Во всплывающем меню выберите ” Показать определение функции”.
  6. Панель исходного кода переключается на это определение функции.

Chris Robinson
25 дек. 2017, в 13:13

Поделиться

в консоли Chrome:

debug(MyFunction)
MyFunction

Igor Krupitsky
07 дек. 2018, в 16:03

Поделиться

Ещё вопросы

  • 0JS не работает на ПК, но работает на JSFIddle
  • 0ЗАГРУЗКА ДАННЫХ INFILE с удаленного сервера при получении ошибки
  • 0ng-repeat возвращает TypeError: невозможно прочитать свойство ‘insertBefore’ из null
  • 0ASN1C компиляция
  • 1Приложение Android закрывается при добавлении класса-оболочки в манифест
  • 1странная ошибка в java отражении (обработка)
  • 1Как получить доступ к DOM в потоке или подпроцессе Python
  • 0проблема asp.net с datasrc и datafld для получения информации XML
  • 1React Native подписанный apk завершается неудачно после обновления версии средства сборки gradle до 3.2.1
  • 0выбрать элемент окна выбора по номеру элемента в jQuery
  • 0Как мне очистить эти вложенные циклы?
  • 0Mvc: вызов метода контроллера и использование значения, выбранного из выпадающего списка в этом методе
  • 0Цикл объектов в массиве JS
  • 0Исправление синтаксической ошибки переменной селектора jQuery
  • 1Громкость голоса, полученного с микрофона, произвольно уменьшается (Android, OpenSLES)
  • 0Я пытаюсь заполнить поле со списком в front-end значением поля из базы данных
  • 0Добавление большого количества html и php контента как переменной PHP
  • 0Div точная высота как высота окна
  • 0Отслеживание прогресса пользователей во время отправки теста / формы
  • 1Компаратор работает для моего ArrayList, но код выглядит неправильно?
  • 0показать отслеживаемый объект в видео с помощью OpenGL
  • 0GLUT взаимодействие с мышью
  • 0MySQL на проблемах чувствительности к регистру Ubuntu
  • 0Отличная условная блокировка в 2-х функциях
  • 1Получить IP-адрес из последней строки файла журнала, используя Regex
  • 0удалить дубликаты на левой таблице, сохраняя дубликаты на правой таблице SELECT JOIN
  • 1Скрыть StatusBar в Trusted Web Activity
  • 0Эффективный способ перенаправления страниц с использованием угловых JS
  • 0Как я могу использовать кнопку WindowsFormApplication для переключения между двумя приложениями Windows (заставить их наверх)?
  • 0AngularJS просмотры нарушены после перенаправления oauth
  • 0Авто-увеличение при изменении ориентации в iOS 7
  • 1WP8 BUG: несоответствие идентификатора подписи кода при установке из хаба компании
  • 1Не удалось создать сборку. Ссылочная сборка “Google.Apis” не имеет строгого имени.
  • 1python – замена фрагмента из строки [duplicate]
  • 0Цвет наложения JQuery FancyBox
  • 0Вставить несколько строк в laravel с полезной нагрузкой JSON
  • 1java.lang.NullPointerException: попытка чтения из поля ‘android.view.View android.support.v7.widget.RecyclerView $ ViewHolder.itemView’
  • 0Обновление разделов страницы после замены фильтра
  • 1Самый простой способ добавить политику конфиденциальности с моим приложением для Android
  • 1Есть ли Java-эквивалент службы Windows
  • 1Java Swing: включение / отключение компонентов определенного типа
  • 1Как остановить масштабирование навигационной панели инструментов Matplotlib при обновлении графика?
  • 0JQuery Searchbox IE9 проблема
  • 1Могу ли я реализовать трехслойную архитектуру при создании диаграммы классов UML?
  • 1Как читать ObjectInputStream без знания того, что было сериализовано?
  • 1dc.js Вид по умолчанию для таблицы строк отсортирован и не переупорядочивается при нажатии
  • 2Android – Как получить координаты персонажа в текстовом представлении
  • 0Не удается сбросить форму с помощью ‘$ setPristine’
  • 1SoftKeyboard накладывается на EditText – ConstraintLayout
  • 0Получить значения из QDialog

Сообщество Overcoder

Многие новички задаются вопросом типа:

  • Как вызвать функцию по ее имени
  • Как вызвать функцию если ее имя хранится в переменной
  • Ну, и тому подобные вопросы 🙂

Возьмем пример задачи:


var name = 'myFunc';

function myFunc(text) {
    alert(text);
}

И так, у нас есть функция под именем myFunc и переменная name которая содержит в себе имя функции.

Как можно вызвать функцию, используя переменную ?
Есть 3 варианта решения этой задачи:

  • Использовать объект window
  • Использовать функцию eval()
  • Создать свой объект, в котором описать функцию.

1) Использовать объект window

На мой взгляд самый подходящий вариант.

Делается следующим образом:


window[funcName](params);

funcName – имя вызываемой функции
params – параметры передаваемые функции.

Нашу задачу можно решить следующим образом:


var name = 'myFunc';

function myFunc(text) {
    alert(text);
}

window[name]('bla bla bla'); //Вызываем функцию myFunc и передаем в качестве параметра текст "bla bla bla"

Вот еще примеры:


window['alert']('bla bla bla'); // Выведется Alert с текстом "bla bla bla" 

var myFunc = 'myAlert';
function myAlert(text) {
   alert(text);
}
window[myFunc]('bla bla bla'); // Выведется Alert с текстом "bla bla bla" 



2) Использовать функцию eval()


С помощью функции eval() можно выполнить какую ту часть кода, в том числе и вызвать функцию.
Пример:


function myAlert(text) {
   alert(text);
}

eval('myAlert("bla bla bla");');

Нашу задачу можно решить так:


var name = 'myFunc';

function myFunc(text) {
    alert(text);
}

eval(name+'("bla bla bla");'); //Вызываем функцию myFunc и передаем в качестве параметра текст "bla bla bla"

Но не злоупотребляйте данной функции так как неправильное использование eval():

  • Открывает ваш код для Инъекций
  • Отладка может быть более сложная (без номера строк)
  • Код выполняется медленее

3) Создать свой объект, в котором описать функцию

И так, как вариант мы можем создать свой объект и из него вызвать функцию, по сути получится тоже самое как и использование объекта window.

Пример:


var obj = {
   firstFunc: function(text) {
      alert('first func:  '+text);
   },
   secondFunc: function(text) {
      alert('second func:  '+text);
   }
}

obj['firstFunc']("bla bla bla"); //Вызываем функцию firstFunc
obj['secondFunc']("bla bla bla"); //Вызываем функцию secondFunc

var name = 'first';
obj[name+'Func']("bla bla bla"); //Вызываем функцию firstFunc

Нашу задачу можно решить следующим образом:


var name = 'myFunc';

obj = { // Описываем наш объект
   myFunc: function(text) { //Описываем нашу функцию в объекте
      alert(text);
   }
}

obj[name]("bla bla bla"); //Вызываем функцию myFunc из объекта obj и передаем в качестве параметра текст "bla bla bla"

Заключение
Ну вот примерно и все 🙂
По моему мнению самый оптимальный вариант это использовать объект window хотя редко бывают ситуации когда имя функции берется из переменной, по сути вам даже стоит избегать таких ситуации и искать другие решения.

Добавить комментарий