Cześć Mam linię kodu, którą czytam z pliku:

x = funct(arg1, arg2, arg3, ... , argn)

Liczba args, a ich nazwy są nieznane. Są one oddzielone przecinkami, a wszystkie argumenty są zamknięte w zestawie szelki ().

W moim skrypcie Pythona chciałbym wyodrębnić nazwy argumentów i tworzą tuple jak więc:

Line = "x = mathfunction(op, mul, div, add)"
ArgsTuple = ExtractArgs(Line)
print ArgsTuple

Pożądane wyjście:

["op", "mul", "div", "add"]

Gdzie ExtractArgs jest funkcją magiczną, która przetwarza linię do tuple.

Czuję, że powinno być całkiem łatwe, ale po prostu nie widzę, jak.

0
Oliver Farren 26 czerwiec 2017, 14:56

3 odpowiedzi

Najlepsza odpowiedź

Możesz wiele razy split() string, aby uzyskać wynik, na przykład:

Line = "x = mathfunction(op, mul, div, add)"
print Line.split('(')[1].split(')')[0].split(', ')

Wynik:

['op', 'mul', 'div', 'add']

EDYTOWAĆ:

Możesz wpisać rzuć go do tuple(), jeśli chcesz, jak:

tuple(Line.split('(')[1].split(')')[0].split(', '))
1
Mohd 26 czerwiec 2017, 12:23

Alternatywą do wyodrębniania danych z metodami manipulacji ciągów można przeanalizować linię do abstrakcyjnego drzewa składni i wyodrębnij nazwiska z węzła połączenia:

import ast

class ArgumentExtractor(ast.NodeVisitor):
    def visit_Call(self, node):
        self.args = [name.id for name in node.args]

def get_names(line):
    node = ast.parse(line)
    a = ArgumentExtractor()
    a.visit(node)
    return a.args

line = "x = mathfunction(op, mul, div, add)"
names = get_names(line)
print(names)

Wynik:

['op', 'mul', 'div', 'add']

Jedną z korzyści, które ma to, że przyjmie tylko linie, które są rzeczywiście ważne python. Przypuśćmy, że otrzymujesz te linie z nieczystego źródła i nie jesteś pewien, czy jest to śmieci, czy nie. Jeśli twoja linia jest czymś w rodzaju "f(x,y,z)!)@)#)", być może wolisz, aby twój program był tutaj zderzający się, zamiast przekazywać krotkę wartości, które mogą gumy w późniejszym miejscu w trudniejszej do diagnozowania plamki. Porównaj ExtractArgs z drugiej odpowiedzi:

>>> s = "f(x,y,z)!)@)#)"
>>> ExtractArgs(s)
['x', 'y', 'z)!)@)#']

I wyrażenie Moe:

>>> s = "f(x,y,z)!)@)#)"
>>> s.split('(')[1].split(')')[0].split(', ')
['x,y,z']

... do get_names:

>>> s = "f(x,y,z)!)@)#)"
>>> get_names(s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in get_names
  File "C:\Programming\Python 3.5\lib\ast.py", line 35, in parse
    return compile(source, filename, mode, PyCF_ONLY_AST)
  File "<unknown>", line 1
    f(x,y,z)!)@)#)
            ^
SyntaxError: invalid syntax

Teraz możesz utworzyć próbę, z wyjątkiem obsługi Syntaxerors w przypadku złych linii.

0
Kevin 26 czerwiec 2017, 12:43

Użyłbym czegoś takiego:

def ExtractArgs(text):
  return list(i for i in text.split('(')[1][:-1].split(','))

line = "x = mathfunction(op, mul, div, add)"
ArgsTuple = ExtractArgs(line)
print ArgsTuple
0
AhmedAbdelaal 26 czerwiec 2017, 12:11