TypeError:__init__() missing 2 required positional arguments

Viewed 4288

I am currently running into this error. I don't know what this error is caused by because I've declared the positional arguments path2 and path3 already in my code but the error says that this two arguments missing.

Error Message:TypeError: __init__() missing 2 required positional arguments: 'path2' and 'path3'

This is my code:

import os
from tqdm import tqdm

from utils import SOS, EOS, UNK, process


class Corpus(object):
    def __init__(self, path, path2, path3, order, lower=False, max_lines=-1):
        self.order = order
        self.lower = lower
        self.max_lines = max_lines
        self.vocab = set()
        self.train = self.tokenize(os.path.join(path), training_set=True)
        self.valid = self.tokenize(os.path.join(path2))
        self.test = self.tokenize(os.path.join(path3))

    def tokenize(self, path, training_set=False):
        """Tokenizes a text file."""
        #assert os.path.exists(path)
        with open(path, path2, path3) as fin:
            num_lines = sum(1 for _ in fin.readlines())
        with open(path, path2, path3, 'r', encoding="utf8") as f:
            words = []
            for i, line in enumerate(tqdm(f, total=num_lines)):
                if self.max_lines > 0 and i > self.max_lines:
                    break
                line = line.strip()
                if not line:
                    continue  # Skip empty lines.
                elif line.startswith('='):
                    continue  # Skip headers.
                else:
                    sentence = (self.order - 1) * [SOS] + \
                        [process(word, self.lower) for word in line.split()] + [EOS]
                    if training_set:
                        words.extend(sentence)
                        self.vocab.update(sentence)
                    else:
                        sentence = [word if word in self.vocab else UNK for word in sentence]
                        words.extend(sentence)
        return words


if __name__ == '__main__':
    path = 'C://Users//supre//Documents//Python Programme//kenlm//wikitext-2//wiki.train.tokens'
    path2 = 'C://Users//supre//Documents//Python Programme//kenlm//wikitext-2//wiki.valid.tokens'
    path3 = 'C://Users//supre//Documents//Python Programme//kenlm//wikitext-2//wiki.test.tokens'
    corpus = Corpus(path, order=3)
    print(len(corpus.test))
    print(corpus.test[:100])

Thank's for every help and suggestion in advance:)

2 Answers

You need to pass these parameters when calling an object of class Corpus.
corpus = Corpus(path, path2, path3, order=3)

The name of the arguments in the constructor has nothing related to the name of the variables you pass to it, so you need to pass them all, there is no mechanism of taking the same-name variables

class Corpus(object):
    def __init__(self, path, path2, path3, order, lower=False, max_lines=-1):
        self.order = order
        self.lower = lower
        self.max_lines = max_lines
        self.vocab = set()
        self.train = self.tokenize(path, training_set=True)
        self.valid = self.tokenize(path2)
        self.test = self.tokenize(path3)

if __name__ == '__main__':
    pa = 'C://Users//...//kenlm//wikitext-2//wiki.train.tokens'
    pa2 = 'C://Users//...//kenlm//wikitext-2//wiki.valid.tokens'
    pa3 = 'C://Users//...//kenlm//wikitext-2//wiki.test.tokens'

   corpus = Corpus(pa, pa2, pa3, order=3)

Also os.path.join with 1 variable does nothing special

Related