Как вернуть 'pass' из функции или метода? - PullRequest
0 голосов
/ 03 января 2019

Я создал метод, который разбивает предложение на слова и возвращает первое слово предложения (для этого можно использовать NLTK tokenizer или argparse, но так как это проект класса, предназначенный для изучая Python, я создал простой токенизатор с нуля) У метода также есть полезный аргумент 'help', в котором передача -h или --help вызовет текст справки. Однако я хочу, чтобы функция выводила текст справки, а затем 'break' или 'pass', если пользователь передает -h или --help. Вот мой метод:

class example_method(object):
    def __init__(self):
        self.data = []

    def parse(self, message):
        if(("-h" or "--help") in message): 
            print("This is a helpful message")
        else:
            self.data = [x.strip() for x in message.split(' ')]
            return self.data

Если пользователь вводит обычное сообщение, метод работает. Позвольте мне проиллюстрировать:

example = example_method()
input_message = "Hello there how are you?"
print(example.parse(input_message)[0])

Вышеуказанное работает хорошо. Однако, если пользователь вводит -h или --help, метод возвращает ошибку:

example = example_method()
input_message = "--help"
print(example.parse(input_message)[0])

Выше вернется: TypeError: 'NoneType' object is not subscriptable Я понимаю, что возможное решение:

try: print(example.parse(input_message)[0])
except: pass

Но есть ли способ вернуть pass изнутри метода, подобного этому?

    def parse(self, message):
        if(("-h" or "--help") in message): 
            print("This is a helpful message")
            return pass
        else:
            self.data = [x.strip() for x in message.split(' ')]
            return self.data

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

Ответы [ 5 ]

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

Благодаря всем вашим предложениям я создал свой собственный модуль синтаксического анализа команд для решения этой проблемы. Вы можете найти его на GitHub: https://github.com/MonkeyBot2020/comparse

Вот несколько примеров его использования:

from comparse import comparse
query = comparse(False)
query.add_argument("log_channel", "str", "logs.txt", "Logs the channel in specified file. DEFAULT ARGUMENT(S): log_channel 'logs.txt'")
query.add_argument("content_filter", "str", "None", "Filter log by content. DEFAULT ARGUMENT(S): content_filter 'None'")
query.add_argument("log_attachments", "bool", True, "Logs attachments. DEFAULT ARGUMENT(S): log_attachments 'True'")
query.add_argument("log_author", "bool", False, "Logs author of message. DEFAULT ARGUMENT(S): log_author=False")
query.add_argument("exclude_content", "str", "None", "Exclude content from log. DEFAULT ARGUMENT(S): exclude_content='None'")

#FIRST EXAMPLE
message = "log_channel --h"
file_name = query.parse(message)
try: print(file_name['exclude_content'][0])
except: print(query.parse("--help"))

#SECOND EXAMPLE
message = "log_channel=example.txt, content_filter=posted, log_attachments=True, log_author=True, exclude_content='apple, pear, orange'"
file_name = query.parse(message)
try: print(file_name)
except: print(query.parse("--help"))

#THIRD EXAMPLE
message = "log_channel, exclude_content='apple, pear'"
file_name = query.parse(message)
try: print(file_name['exclude_content'])
except: print(query.parse("--help"))

#FOURTH EXAMPLE
message = "i made a booboo"
file_name = query.parse(message)
try: print(file_name['mistaken_content'][0])
except: print(query.parse("--help"))

Надеюсь, это полезно:)

0 голосов
/ 03 января 2019

Попробуйте использовать argparse для автоматической генерации флагов -h и --help и текста справки.

Демонстрация с минимальными усилиями:

script.py

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-p', help='This will be printed')
args = parser.parse_args()

print(args.p)

использование:

$ python3 script.py -p hello
hello
$ python3 script.py -h
usage: script.py [-h] [-p P]

optional arguments:
  -h, --help  show this help message and exit
  -p P        This will be printed

Как видите, использование -h (или --help) отображает сообщение справки и не выполняет никакого другого кода (по умолчанию).

0 голосов
/ 03 января 2019

Вы можете использовать exit(), чтобы немедленно остановить выполнение программы.

def parse(self, message):
    if(("-h" or "--help") in message): 
        print("This is a helpful message")
        exit()
    else:
        self.data = [x.strip() for x in message.split(' ')]
        return self.data
0 голосов
/ 03 января 2019

Вы должны продумать свой дизайн ... добавить

def help(self): 
    print("Cool description")

и удалите «парсинг переключателя справки» из def parse(self, message).

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

"Paris is a cool town-however you travel it: by foot, by bike or by parachute." 

См. SRP (принцип единой ответственности) - parse не должен печатать справочные сообщения.


Вы также можете использовать документацию для предоставления help():

class well_documented_example_class(object):
    """Totally well documented class"""

    def parse(self, message):
        """This method does coool things with your 'message'

        'message' : a string with text in it to be parsed"""
        self.data = [x.strip() for x in message.split(' ')]
        return self.data

Вы получаете помощь, выдав:

print(help(well_documented_example_class))

чтобы получить:

class well_documented_example_class(builtins.object)
 |  Totally well documented class
 |  
 |  Methods defined here:
 |  
 |  parse(self, message)
 |      This method does coool things with your 'message'
 |      
 |      'message' : a string with text in it to be parsed
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |  
 |  __dict__
 |      dictionary for instance variables (if defined)
 |  
 |  __weakref__
 |      list of weak references to the object (if defined)
0 голосов
/ 03 января 2019

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

например:

class example_method(object):
    # …
    def parse(self, message):
        if message in {"-h", "--help"}:
            print("This is a helpful message")
            return  # implicitly returns None

        self.data = [x.strip() for x in message.split(' ')]
        return self.data

res = example.parse(input_message)
if res is None:
    return

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