7

この短い小さなプログラムは、Python でオブジェクト指向設計を独学するための努力として作成しました。しかし、現在、非常に紛らわしいエラーが発生しています。

  Traceback (most recent call last):
  File "main.py", line 97, in <module>
  cli()
  File "C:\Python27\lib\site-packages\click\core.py", line 716, in __call__
  return self.main(*args, **kwargs)
  File "C:\Python27\lib\site-packages\click\core.py", line 695, in main
  with self.make_context(prog_name, args, **extra) as ctx:
  File "C:\Python27\lib\site-packages\click\core.py", line 620, in make_context
  self.parse_args(ctx, args)
  File "C:\Python27\lib\site-packages\click\core.py", line 874, in parse_args
  value, args = param.handle_parse_result(ctx, opts, args)
  File "C:\Python27\lib\site-packages\click\core.py", line 1390, in handle_parse_result
  value = self.full_process_value(ctx, value)
  File "C:\Python27\lib\site-packages\click\core.py", line 1675, in full_process_value
  return Parameter.full_process_value(self, ctx, value)
  File "C:\Python27\lib\site-packages\click\core.py", line 1359, in full_process_value
  value = self.process_value(ctx, value)
  File "C:\Python27\lib\site-packages\click\core.py", line 1349, in process_value
  return self.type_cast_value(ctx, value)
  File "C:\Python27\lib\site-packages\click\core.py", line 1332, in type_cast_value
  return self.type(value or (), self, ctx)
  File "C:\Python27\lib\site-packages\click\types.py", line 38, in __call__
  return self.convert(value, param, ctx)
  File "C:\Python27\lib\site-packages\click\types.py", line 472, in convert
  raise TypeError('It would appear that nargs is set to conflict '
  TypeError: It would appear that nargs is set to conflict with the composite type arity.

このエラーは、クリックベースの CLI で発生しています。エラーを引き起こしているオプションの1つに引数がないため、これは奇妙です。

#-*- coding: utf-8 -*-

import click
import json
import glob
import os

def prompt(question):
    val = raw_input(question + ' > ')
    return val

def mkdir(path):
    if not os.path.isdir(str(path)):
            os.mkdir(str(path))
    return str(path)


class Profile(object):
    def __init__(self, name, age, weight, job, salary):
        self.name = name
        self.age = age
        self.weight = weight
        self.job = job
        self.salary = salary

        self.data = { 'name' : '',
                      'age' : '',
                      'weight' : '',
                      'job': '',
                      'salary' : ''
                     }

    def new_profile(self, name, age, job, weight, salary, fname):
        self.data['name'] = name
        self.data['age'] = age
        self.data['job'] = job
        self.data['weight'] = weight
        self.data['salary'] = salary
        self.fname = fname

        self.dirname = mkdir('.profiles\\')

        with open(str(self.dirname) + str(self.fname) + '.json', 'w') as self.profile:
            json.dump(self.data, self.profile)

        print 'Profile saved!'


    def list_profile(self):
        print glob.glob('.profiles/*.json')

    def print_profile(self, fname):
        try:
            self.fname = fname

            with open('.profiles\\' + str(self.fname) + '.json') as data_file:
                self.profile = json.load(data_file)

            self.name = self.profile['name']
            self.age = self.profile['age']
            self.weight = self.profile['weight']
            self.job = self.profile['job']
            self.salary = self.profile['salary']

            print 'name: {}\nage: {}\nweight: {}\noccupation: {}\nsalary: {}'.format(self.name, self.age, self.weight, self.job, self.salary)

        except IOError:
            print 'File not found'

@click.command(options_metavar='<options>')
@click.option('--new_profile', '-n',
              nargs=6,
              type=click.Tuple([str, str, str, str, str, str]),
              metavar='<name, age, occupation, weight, salary, filename>',
              help='Creates a new profile')
@click.option('--list_profile', '-l',
              is_flag=True,
              help='Lists all profiles that currently exist')
@click.option('--print_profile', '-p',
              type=(str),
              metavar='<profile name>',
              help = 'prints data from a saved profile')
def cli(new_profile, list_profile, print_profile):
    profile = Profile('', '', '', '', '')

    if new_profile:
        profile.new_profile(new_profile[0], new_profile[1], new_profile[2], new_profile[3], new_profile[4], new_profile[5]) # name, age, job, weight, salary, fname
    elif list_profile:
        profile.list_profile()
    elif print_profile:
        profile.print_profile(print_profile)

if __name__ == '__main__':
    cli()

私はこのトレースバックに約1日苦労しており、結果はありません。助言がありますか?ありがとう!

編集:私はそれを修正しましたが、その過程で論理エラーを作成しました.

default=(None, None, None, None, None, None))

この引数をクリック オプション new_profile に追加しました。ただし、他の引数を使用すると、実行されます

Profile.new_profile(None, None None, None, None None)

したがって、すべての値が null でnone.json呼び出される新しいファイルが作成されます。.profileしたがって、技術的にはこの問題を解決したと思いますが、さらに大きな問題を作成しました。

4

1 に答える 1