使用 Python 在 class 内点击

Using Python Click within a class

我有一个我制作的旧抽认卡应用程序,我已将其重新用于一些 aws 证书研究。我在几年前编写并彻底修改了该代码,其中一项更改涉及使用 click 而不是 argparse,但我在使用 click 时遇到了一些问题。我的代码如下(减去一些额外的功能):

想法是 load_deck() 需要读取 file 参数。我尝试这样做的方式是通过 main()

传递 load_deck() file 参数

最后,运行 这段代码声明在 Flashcards().main() 调用中,main() 缺少位置参数 self。我认为这是我使用 click.

方式的问题
import os
import random
import sys

import click
import keyboard
import ruamel.yaml


class Flashcards:
    """
    pass
    """

    def __init__(self):
        self.deck = ruamel.yaml.YAML()
        self.card = ['key', 'value']

    def load_deck(self, file):
        """
        pass
        """
        with open(file, mode='r') as deck:
            self.deck = self.deck.load(deck)

    @click.command()
    @click.option('-f', '--file', default='aws.yaml', help='specifies yaml file to use')
    @click.option('-r', '--reverse', default=False, help='displays values prompting user to guess keys')
    def main(self, file, reverse):
        """
        pass
        """
        self.load_deck(file)
        if reverse is True:
            self.deck = [
                [card[1], card[0]
                 ] for card in self.deck]

        os.system('clear')
        print('Press [SPACEBAR] to advance. Exit at anytime with [CTRL] + [C]\n'
              'There are {} cards in your deck.\n'.format(len(self.deck)))
        try:
            while True:
                self.read_card()
                self.flip_card()

        except KeyboardInterrupt:
            # removes '^C' from terminal output
            os.system('clear')
            sys.exit(0)


if __name__ == "__main__":
    Flashcards().main()

该程序读取以下格式的 yaml 文件(它以前是一个西班牙语抽认卡应用程序):

bajar: to descend
borrar: to erase
contestar: to answer

Click 并非自然而然地设计为以这种方式工作,例如 this issue 如果您想走那条路,其中还包括评论中人们提供的一些解决方法。

在您的情况下,您可以从 class 中提取 main 并让它为您实例化 Flashcards

@click.etc.
def main(file, reverse):
    f = Flashcards()
    f.load_deck(file)
    # And so on, using 'f' instead of 'self'