2012-03-10 2 views
0

Вот некоторые простые вызовы функций в Python:Python: разделение функции и аргументы

 
foo(arg1, arg2, arg3) 
func1() 

Предположим, что является допустимым вызовом функции.

Предположим, что я прочитал эти строки при разборе файла.

Каков самый чистый способ разделения имени функции и args на список с двумя элементами, первая строка для имени функции, а вторая строка для аргументов?

Желаемые результаты:

 
["foo", "arg, arg2, arg3"] 
["func1", ""] 

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

ответ

2

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

import re 

def explode(s): 
    pattern = r'(\w[\w\d_]*)\((.*)\)$' 
    match = re.match(pattern, s) 
    if match: 
     return list(match.groups()) 
    else: 
     return [] 
+0

О, круто, он обрабатывает ввод с вложенными круглыми скобками. Как это соотносится с скобками? – MxyL

+2

Это не так. Это эквивалентно вашей текущей реализации, поскольку он просто выбирает последнюю скобку на линии. – Amber

+0

ой, ха-ха я вижу. – MxyL

2

Если вы разбираете файл Python в Python, рассмотрите возможность использования анализатора Python: ast (в частности, вызов ast.parse()).

Тем не менее, ваш нынешний подход не страшен (хотя он будет прерывать вызовы функций, которые спама несколько строк). Есть немного полностью правильных подходов, кроме вышеупомянутого полного парсера - например, вы могли бы подсчитать совпадающие парсеры, так что a((b,c)) вернет правильное значение, даже если в середине был разрыв строки, но тогда этот код, вероятно, ошибся когда сталкиваются с a((b, "c)")) и так далее.

+0

Спасибо за предложение. Хотя на самом деле это не файл python; Я просто не мог придумать простой способ описать проблему. Это общая проблема, связанная со строками формы «имя (значения)», где вы заинтересованы в том, чтобы отделить имя от значений. – MxyL

+2

Тогда я полагаю, что это зависит от ваших значений, позволяющих использовать в них такие строки, как строки с круглыми скобками? Если они этого не делают, проблема намного проще, но если это так, вы начинаете отслеживать состояние и эффективно переписываете ту же логику разбора, что и язык. – Amber

+0

Это не похоже на то, что любые входы, которые я могу ожидать, содержат круглые скобки, если пользователь не намеренно выбирает неправильные входы. Что в этом случае я могу просто кричать на них за то, что они не следуют формату. – MxyL

Смежные вопросы