Saya punya pertanyaan singkat tentang modul doctest di Python 3.

Saya belum menggunakannya, hanya membaca beberapa informasi dan bagaimana mereka menerapkannya pada fungsi. Saya memiliki dua fungsi yang perlu saya uji dan saya pikir saya mengerti apa yang harus saya lakukan. Namun, saya tidak tahu bagaimana menerapkannya dalam kasus saya. Saya harus fungsi yang bekerja dengan file .txt. Yang pertama mengambil kata dan jalur file ke file teks sebagai input dan outputsa daftar pasangan, masing-masing terdiri dari baris di mana kata itu muncul dan nomor baris yang sesuai.

def find_all_instances(word, path):
    l = []
    with open(path, 'r') as file:
        for position, line in enumerate(file.readlines()):
            if word in line:
                tup = (line, position+1)
                l.append(tup)
        return l
print(find_all_instances('word', 'filename.txt'))

Fungsi kedua mengambil jalur file ke file teks sebagai input dan output daftar pasangan, masing-masing terdiri dari kata dan berapa kali kata muncul dalam teks dalam urutan menurun.

from collections import Counter
import re

def task_2(inp):
    with open(inp, encoding="utf-8") as f:
        data = (x.lower() for x in re.split(r'[\n, .?!:;-]', f.read()) if x.isalpha())
    cnt = Counter(data)
    return cnt.most_common()

task_2(r"filepath")

Pertanyaan saya sekarang adalah: Bagaimana saya bisa menerapkan ini dalam kasus ini? Karena contoh doctest yang saya lihat hanya menggunakan fungsi sederhana yang misalnya mengalikan dua input. Namun, dalam kasus saya, output tampaknya cukup besar karena file teks panjangnya sekitar 10.000 baris dan oleh karena itu outputnya sama besar. Bagaimana cara mengimplementasikannya untuk fungsi-fungsi ini?

0
23408924 20 November 2020, 13:33

1 menjawab

Jawaban Terbaik

Saya menyarankan agar Anda membuat fungsi yang benar-benar melakukan pekerjaan menghasilkan daftar dan mendokumentasikannya:

from collections import Counter
import re

def find_all_instances(word, lines):
    """Returns a list of tuples (line, line_number) for the lines where the word appear.

    >>> find_all_instances('test', ['first line', 'second line for test', 'third test line', 'last line'])
    [('second line for test', 2), ('third test line', 3)]

    """
    l = []
    for position, line in enumerate(lines):
        if word in line:
            tup = (line, position+1)
            l.append(tup)
    return l

def word_counter(text):
    """Returns a list of tuples (word, word_counter) for each word in a text, sorted by the most commons.

    >>> word_counter('Lorem ipsum dolor sit amet, consectetur adipiscing elit.\nSed non risus.\n Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor.')
    [('sid', 2), ('adipiscing', 2), ('amet', 2), ('dolor', 2), ('non', 1), ('ipsum', 1), ('ultricies', 1), ('consectetur', 1), ('risus', 1), ('elit', 1), ('nec', 1), ('tortor', 1), ('lorem', 1), ('lectus', 1), ('sed', 1), ('dignissim', 1)]

    """
    data = (x.lower() for x in re.split(r'[\n, .?!:;-]', text) if x.isalpha())
    cnt = Counter(data)
    return cnt.most_common()

Dan kemudian gunakan dalam fungsi lain yang menangani pembukaan file:

def find_all_instances_from_path(word, path):
    with open(path, 'r') as file:
        return find_all_instances(word, file.readlines())

def task_2(inp):
    with open(inp, encoding="utf-8") as f:
        return word_counter(f.read())

2
Frodon 20 November 2020, 11:08