AttributeError при использовании pla c: объект «Пространство имен» не имеет атрибута - PullRequest
1 голос
/ 31 января 2020

Попытка написать функцию командной строки, и я застрял в этом AttributeError. Я знаю, что другие люди задавали подобные вопросы, но я не видел ни одного, использующего pla c, поэтому я решил написать это.

@plac.annotations(
    training_file=("The filename containing the text you wish to annotate", "option", "-tf", Path),
    entity_type=("The name of the entity you wish to annotate", "option", "-e", str)
)
def main(training_file=None, entity_type=None):
    """Script to more easily annotate spaCy NER training examples"""

    if not training_file:
        training_file = input("Please enter the filename of the data you wish to annotate: ")
        with open(training_file, 'r') as training_file:
            list_to_annotate = training_file.read()

        print(list_to_annotate)

и где он запускается:

if __name__ == "__main__":
    plac.call(main)

В моей фактической команде есть что-то еще, но всякий раз, когда я ее запускаю, я получаю одно и то же сообщение об ошибке:

Traceback (most recent call last):
  File "C:\Users\Steve\PycharmProjects\GroceryListMaker\model_scripts\training_data_maker.py", line 79, in <module>
    plac.call(main)
  File "C:\Users\Steve\PycharmProjects\GroceryListMaker\lib\site-packages\plac_core.py", line 367, in call
    cmd, result = parser.consume(arglist)
  File "C:\Users\Steve\PycharmProjects\GroceryListMaker\lib\site-packages\plac_core.py", line 230, in consume
    args = [getattr(ns, a) for a in self.argspec.args]
  File "C:\Users\Steve\PycharmProjects\GroceryListMaker\lib\site-packages\plac_core.py", line 230, in <listcomp>
    args = [getattr(ns, a) for a in self.argspec.args]
AttributeError: 'Namespace' object has no attribute 'training_file'

Я действительно не уверен, что не так, и это заставляет меня рвать на себе волосы здесь. Спасибо за любую помощь, спасибо.

1 Ответ

1 голос
/ 31 января 2020

Если вы замените его на:

@plac.annotations(
    training_file=("The filename containing the text you wish to annotate",
        "option", "tf", Path),
    entity_type=("The name of the entity you wish to annotate", "option", "e", str)
)

, это сработает (обратите внимание, что я удалил - в сокращениях).

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

$ python -m pdb main.py
> /home/embray/src/junk/so/60005716/main.py(1)<module>()
-> import plac
(Pdb) cont
Traceback (most recent call last):
  File "/usr/lib/python3.6/pdb.py", line 1667, in main
    pdb._runscript(mainpyfile)
  File "/usr/lib/python3.6/pdb.py", line 1548, in _runscript
    self.run(statement)
  File "/usr/lib/python3.6/bdb.py", line 434, in run
    exec(cmd, globals, locals)
  File "<string>", line 1, in <module>
  File "/home/embray/src/junk/so/60005716/main.py", line 1, in <module>
    import plac
  File "/home/embray/.virtualenvs/tmp-954ecd64f7669c29/lib/python3.6/site-packages/plac_core.py", line 367, in call
    cmd, result = parser.consume(arglist)
  File "/home/embray/.virtualenvs/tmp-954ecd64f7669c29/lib/python3.6/site-packages/plac_core.py", line 230, in consume
    args = [getattr(ns, a) for a in self.argspec.args]
  File "/home/embray/.virtualenvs/tmp-954ecd64f7669c29/lib/python3.6/site-packages/plac_core.py", line 230, in <listcomp>
    args = [getattr(ns, a) for a in self.argspec.args]
AttributeError: 'Namespace' object has no attribute 'training_file'
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
> /home/embray/.virtualenvs/tmp-954ecd64f7669c29/lib/python3.6/site-packages/plac_core.py(230)<listcomp>()
-> args = [getattr(ns, a) for a in self.argspec.args]
(Pdb) up
> /home/embray/.virtualenvs/tmp-954ecd64f7669c29/lib/python3.6/site-packages/plac_core.py(230)consume()
-> args = [getattr(ns, a) for a in self.argspec.args]
(Pdb) p ns
Namespace(e=None, tf=None)

Здесь вы можете видеть, что пространство имен вашего аргумента было заменено на e и tf, предполагая, что каким-то образом добавление - в сокращении фактически заменяет имя аргумента ( с моей стороны это было лишь предположение, но оно оказалось верным).

Я бы посчитал, что небольшая ошибка в части пла c - это очень запутанно, и документация не ничего не указывать по этому поводу.

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