Python: Можете ли вы динамически получить количество переменных, в которые функция будет возвращать? - PullRequest
0 голосов
/ 06 ноября 2019

Часть служебной системы, которую я пишу в пакете AcecoolLib, перенося всю / большую часть моей логики на Python и другие языки, содержит простой, но очень полезный помощник ... функцию с именем ENUM.

Он имеет много полезных функций, таких как автоматическое создание карт перечислений, расширенных или обратных карт, если у вас есть карта, назначенная не только для значений, и намного больше.

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

Объявление функции также просто:

def ENUM( _count = None, *_maps ):

У него есть дополнительный помощник ... Здесь: https://www.dropbox.com/s/6gzi44i7dh58v61/dynamic_properties_accessorfuncs_and_more.py?dl=0

Другой не используется. ENUM_MAP есть, а другой нет.

В любом случае, прежде чем я начну изучать и т. Д. И т. Д., Вопрос:

Как подсчитать возвращаемые переменные внефункция ... т.е.:

ENUM_EXAMPLE_A, ENUM_EXAMPLE_B, ENUM_EXAMPLE_C, ENUM_LIST_EXAMPLE, MAP_ENUM_EXAMPLE = ENUM( None, [ '#example_a', '#example_b', '#example_c' ] )

Где List - это простой список 0 = 0, 1 = 1, 2 = 2 или что-то в этом роде. , затем карта связывает так [ 0 = '#example_a', 1 = '#example_b', etc.. ], затем [ '#example_a' = 0, etc.. ] для обратного ... или что-то в этом роде.

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

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

inкратко: я бы хотел избавиться от первого аргумента ENUM( _count, *_maps ), чтобы использовался только необязательный *_maps. Поэтому, если я вызову: ENUM_A, ENUM_B, ENUM_C, LIST_ENUMS = ENUM( );, он обнаружит 4 выходных возврата и получит их имя, чтобы я мог видеть, содержит ли последний определенный текст, отличный от стиля первого ... т.е. если они хотят список,и т. д .... Если они добавляют карту, то необязательный список и т. д., и я могу просто отсчитать n _maps, чтобы найти список аргументов, или нет ...

Я знаю, что это, вероятно, ненеобходимо, но я хочу, чтобы это было легко и динамично, поэтому, если я добавлю новое перечисление в гигантский список, мне не нужно добавлять число (хотя для тех, кто использует карты, это означает, что я должен добавить запись в любом случае)...

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Вот один из предложенных ответов, аналогичный тому, что я мог бы сделать в моей инфраструктуре Lua ... Разница, однако, заключается в том, что моя инфраструктура должна загружать все файлы в память (для динамической перезагрузки и динамических изменений, идущихв соответствующее местоположение - и объединить данные в сеть, объединив все так, чтобы стоимость ввода-вывода в файл была «предотвращена» - и Lua невероятно хорошо обрабатывает таблицы).

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

Логика:

1) Используя трассировки, вы можете определить, какой файл/ путь и какая строка называется функцией ENUM.

2) Считайте вызывающий файл как текст - если вы можете читать напрямую в строку без необходимости обработки всего файла - тогда это будет быстрее. Там могут быть некоторые библиотеки, которые делают это. В Python по умолчанию я не выполнил огромное количество файловых операций ввода-вывода, кроме основ, поэтому я не в курсе всех самых полезных вещей, так как я обычно использую SQL для целей хранения и т. Д ...

3) С помощью рассматриваемой строки разбить текст строки на '=', т.е. перед вызовом функции, чтобы получить аргументы, и самой функцией .. вызвать ее _result

4) a Если у вас нет результатов, то кто-то вызвал функцию, ничего не возвращая - странный ..

4) split _result [0] on',' чтобы получить каждый отдельный аргумент и обрезать пробелы влево / вправо -

5) Объединить чистые аргументы в список ..

6) Обработать аргументы - то есть: определить метод, который разработчик использует для именования их значений перечисления, и посмотреть, отличается ли этот стиль от последнего аргумента (если нет карты). Если map, то вернитесь n или n * 2 элементов для списка, а затем оттуда для карты vars. С картами возвращаются карты - единственное, что мне нужно сделать динамически, это число и определить, есть ли у пользователя список аргументов или нет ..

Примечание: Существуеточень полезный и простой механизм в Python для выполнения многих из этих функций в одной строке с одной строкой кода.

Все это возможно и легко создать в Python. Что мне не нравится в этом решении, так это тот факт, что оно требует файлового ввода-вывода. Если ваша программа выполняется из другой программы и не остается в памяти, это означает, что эти задачи всегда повторяются, что делает его менее дружественным и болеедорогостоящий ...

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

Потому что я использую ENUM во всемВ том числе быстрые исполняемые скрипты, которые запускаются, а затем закрываются - я не хочу использовать файл ввода-вывода ..

Но решение действительно существует. Я ищу альтернативу.

0 голосов
/ 06 ноября 2019

Простой ответ: вы не можете.

В Python, когда вы делаете (a, b, c) = func(), это называется распаковкой кортежей. По сути, он ожидает, что func() вернет tuple ровно 3 элементов (в этом примере). Тем не менее, вы также можете сделать a = func(), и тогда a будет содержать трехэлементный кортеж или любой другой элемент, который func решил вернуть. Независимо от того, как вызывается func, в методе нет ничего, что знает, как будет возвращаться возвращаемое значение после его возврата.

Я хотел предоставить более питонический способ выполнения того, что вы намереваетесь, но я не совсем уверен, что понимаю цель ENUM(). Кажется, вы пытаетесь создать константы, но Python на самом деле не имеет истинных констант.

РЕДАКТИРОВАТЬ:

Методы знают только то, что передается в качестве аргументов. Если вы хотите, чтобы какой-нибудь ENUM оценивал отображение, то лучшим эквивалентом является dict. Тогда у вас мог бы быть метод, который бы взял ENUM('A', 'B', 'C') и вернул {'A':0, 'B':1, 'C':2}, а затем вы использовали бы dict looku-ups для получения значений.

enum = ENUM('A', 'B', 'C')
print(enum['A'])  # prints 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...