Я заблудился с этой программой Python - PullRequest
0 голосов
/ 17 марта 2019
import sys
import pathlib
import os
def GetAndSplitCommand(line, file):
    if line is 1:
        line = 0
    f=open(file)
    lines=f.readlines()
    unsplit=lines[line]
    split=unsplit.split()
    return split

def ExecuteCode(*args):
    lists = [item for item in args]
    print(lists)
    parameters = args
    if lists[0] == "hi":
        HelloWorld()
        return
    elif lists[0] == "bye":
        GoodbyeWorld()
        return

def HelloWorld():
    print(" Hello World!")
    return
def GoodbyeWorld():
    print(" Bye World!")
    return
command = GetAndSplitCommand(1, "food.txt")
ExecuteCode(command)

В food.txt у меня есть слово "hi", поэтому с этим кодом он должен распечатать "Hello World!", Однако он просто печатает [['hi']].Я много раз пытался переформатировать код, и мне нужен совет относительно того, что мне нужно делать.

Кроме того, это не проблема с отступом, stackoverflow просто не подходит для моего кода.

Еще одно примечание: эта программа по сути предназначена для чтения строки файла, разделения строки на отдельные «параметры» и использования функции ExecuteCode () для выполнения каких-либо действий, если первым параметром является X.

1 Ответ

0 голосов
/ 17 марта 2019

Мне кажется, вы неправильно поняли, что *args делает в объявлении функции.

Когда вы пишете def ExecuteCode(*args):, вы остаетесь, что хотите разрешить вызов ExecuteCode с переменным числом аргументов. Например, другой код может вызвать ExecuteCode("foo", "bar", "baz") (три аргумента) или ExecuteCode() (ноль аргументов). Переменная args в функции будет списком значений этих аргументов (поэтому ["foo", "bar", "baz"] или [] для моих двух примеров вызовов).

В вашем коде вы вызываете функцию с одним аргументом ExecuteCode(command). Если command является списком ['hi'], то внутри ExecuteCode, args будет [['hi']], поскольку он всегда помещает аргументы в список, поскольку их может быть несколько.

Вам, вероятно, не нужно использовать *args здесь. Вместо этого просто используйте:

def ExecuteCode(lists):
    if lists[0] == "hi":
        ...

Обратите внимание, что есть несколько других стилевых проблем с вашим кодом (это не помешает его запуску, но сделает его более сложным или запутанным, чем должно быть). Одной из проблем является наименование. Общепринятым соглашением Python является использование lowercase_names_with_underscores для большинства функций и резервирование CapitalizedNames для классов. Другая проблема заключается в выборе имен, которые ясно знают, что они делают. Переменная lists в ExecuteCode является примером этого. В вашем текущем коде ошибки это список списков, так что имя может иметь некоторый смысл (если это было то, что вы хотели), но если вы измените его, как я предлагаю выше, чтобы быть списком строк, вы следует переименовать его как-нибудь еще, так как это больше не список списков.

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