Я пытаюсь создать очень простой скрипт, который использует TkInter для рисования линий на основе ввода пользователем. Пользователь выполнит сценарий через командную строку, используя параметры для определения линий.Создание словаря синтаксического анализа для использования с sys.argv
Возможные команды:
(# signifies any whole number the user chooses)
P # (selects a pen to draw with)
D (pen down/starts drawing)
N # (moves the pen north # increments)
E # (moves the pen east # increments)
S # (moves the pen south # increments)
W # (moves the pen west # increments)
U (pen up/stops drawing)
Пример:
Parser.py P 3 D N 4 E 2 S 4 W 2 U
Приведенный выше пример будет использовать высокий прямоугольник.
Я пытаюсь создать базовый парсер для sys.argv, который будет проходить через все аргументы и выполнять методы из словаря на основе указанных аргументов и его порядка.
Вот мой код, который проходит через sys.argv и создает массив на основе аргументов (я буду добавлять проверки ошибок, так что просто взять на себя счастливый день сценария сейчас):
class JoshSourceReader(object):
""" responsibe for providing source text for parsing and drawing
Initiates the Draw use-case.
Links to a parser and passes the source text onwards """
def __init__(self):
self.parser = JoshParser()
self.source = []
def go(self):
i = 1
x = len(sys.argv)
while i < x:
if sys.argv[i]=="P":
self.source.append("P " + str(sys.argv[i + 1]))
i += 2
elif sys.argv[i]=="D":
self.source.append("D")
i += 1
elif sys.argv[i]=="N":
self.source.append("N " + str(sys.argv[i + 1]))
i += 2
elif sys.argv[i]=="E":
self.source.append("E " + str(sys.argv[i + 1]))
i += 2
elif sys.argv[i]=="S":
self.source.append("S " + str(sys.argv[i + 1]))
i += 2
elif sys.argv[i]=="W":
self.source.append("W " + str(sys.argv[i + 1]))
i += 2
elif sys.argv[i]=="U":
self.source.append("U")
i += 1
self.parser.parse(self.source)
Таким образом, массив, который будет генерироваться из моего примера выше будет выглядеть следующим образом:
source=['P 3', 'D', 'N 4', 'E 2', 'S 4', 'W 2', 'U']
Так что мой вопрос заключается в следующем: Как создать эффективный словарь методов, который работает с выше массивом и выполняет методы, основанные на лучей, один за другим? Я даже начинаю сомневаться, если это возможно из-за того, что некоторым методам потребуются свойства, прошедшие (число), а некоторые - нет. Кто-нибудь может пролить свет на этот вопрос?
И, пожалуйста, имейте в виду, что я очень новый для Python.
EDIT: Я забыл одну важную информацию. N, E, S, W все относятся к одному и тому же методу, но каждый раз он принимает разные аргументы. Вот метод (еще не рисовать):
def drawLine(self, direction, distance):
print("drawing line of length " + str(distance) + " at "
+ str(direction))
Так что, если бы я вызвать этот метод с использованием «S 3», я бы назвал это так:
drawer.drawLine(180, 3)
И если бы я вызвать его, используя «W 1», я бы назвал это так:
drawer.drawLine(270, 1)
Абсолютно совершенный. Я думаю, что это займет у меня некоторое время, прежде чем я полностью пойму код, но я стараюсь изучить его, пока не сделаю. И я использую Python 3.x, но легко менял заявления печати. – Djentleman
Я изменил его в любом случае, для дальнейшего использования. –