Я хочу превратить атрибут класса в кортеж, который получает входные данные через необработанные пользовательские входы и сохраняет результаты в файл - PullRequest
0 голосов
/ 24 августа 2018

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

from pip._vendor.distlib.compat import raw_input
class User():
    '''simulates a user for a social network or pc'''
    def __init__(self, first_name, last_name, username,location, interests):
        '''initialize attributes of user class'''
        self.first_name = first_name.title()
        self.last_name = last_name.title()
        self.username = username
        self.location = location.title()
        self.interests = interests

    @classmethod
    def get_userinfo(cls):
        '''each attribute of User is defined by a user input'''    
        return cls(
            raw_input("Welcome. PLease Enter Your First Name: "),
            raw_input("Please Enter Your Last Name: "),
            raw_input("Username: "),
            raw_input("What is your location? : "),
            raw_input("List some of your interests: ")
            )

    def __str__(self):
        '''returns all attributes of User as strings'''
        return str("User: " + self.first_name + self.last_name + 
                   "\nUsername: " + self.username + 
                   "\nLocation: " + self.location + 
                   "\nInterests: " + self.interests)

'''creates an instance of User object'''
user1 = User.get_userinfo()

'''writes each attribute of User into a file'''
filename = r'''C:\Users\User\Documents\dataset1.txt'''
with open(filename, 'r+') as file_object:
    contents = file_object.write(str(user1))        

Я хочу превратить параметр «интересов» в кортеж или список.Пользователь должен иметь возможность вводить много интересов и решать, когда останавливаться с помощью флага, такого как 'active = True', а затем, наконец, возвращать результаты в виде строки, чтобы иметь возможность записать их в файл.

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Я хочу превратить параметр «интересов» в кортеж или список.Пользователь должен иметь возможность ввести много интересов и решить, когда останавливаться с помощью флага, такого как 'active = True'

Я не уверен, как пользователь собирается установить active=True, ноостальная часть этого предложения просто кричит «Я хочу цикл»:

@classmethod
def get_userinfo(cls):
    first = raw_input("Welcome. PLease Enter Your First Name: ")
    last = raw_input("Please Enter Your Last Name: ")
    user = raw_input("Username: ")
    location = raw_input("What is your location? : ")
    interests = []
    print("List some of your interests (just type Return on its own when you're done)")
    while True:
        interest = raw_input().strip()
        if not interest:
            break
        interests.append(interest)

ОК, это дает нам список, а не кортеж.Мы могли бы создать кортеж, выполнив interests = interests + (interest,), но это неуклюже и неэффективно.Если вам действительно нужен кортеж, на самом деле проще просто создать список и затем преобразовать его в конце:

    interests = tuple(interests)

И теперь мы можем передать все эти переменные в конструктор:

    return cls(first, last, user, location, interests)

… и, наконец, вернуть результаты в виде строки, чтобы можно было записать их в файл.

Hold on;какой тип файла вы здесь создаете?

Если этот файл предназначен для чтения и редактирования человеком и никогда больше не просматривается Python, это легко.Вы можете, например, просто join заполнить их пробелами, запятыми, символами новой строки или чем угодно.Или вы можете вручную зациклить их, чтобы сделать их более причудливыми:

def write_to_file(self, filename):
    with open(filename, 'w') as file:
        file.write('First Name: {}\n'.format(self.first_name))
        file.write('Last Name: {}\n'.format(self.last_name))
        file.write('Username: {}\n'.format(self.username))
        file.write('Location: {}\n'.format(self.location))
        file.write('Interests:\n')
        for interest in self.interests:
            file.write('    {}\n'.format(interest))

Но если он предназначен для хранения данных, которые будут позже прочитаны Python, вы захотите записать вещи в формате, который предназначен длябыть разобраннымВозможно, добавьте метод для сериализации ваших объектов в JSON и из него, например:

def to_json(self):
    return json.dumps({'first': self.first_name, 'last': self.last_name,
                       'user': self.username, 'location': self.location,
                       'interests': self.interests})

@classmethod
def from_json(cls, j):
    dct = json.loads(j)
    return cls(dct['first'], dct['last'], dct['user'], 
               dct['location'], dct['interests'])

А теперь, чтобы записать его в файл:

with open(filename, 'w') as f:
    f.write(user.to_json())
0 голосов
/ 24 августа 2018

Извините, я не слежу за флагом. Но это то, что вы имели в виду? Вы останавливаетесь, просто вводя свои предметы. * Я буду обновлять, если я неправильно понял

$ vi test.txt
$ python test.txt
from pip._vendor.distlib.compat import raw_input
class User():
    '''simulates a user for a social network or pc'''
    def __init__(self, first_name, last_name, username, location, interests):
        '''initialize attributes of user class'''
        self.first_name = first_name.title()
        self.last_name = last_name.title()
        self.username = username
        self.location = location.title()
        self.interests = interests.split(', ')

    @classmethod
    def get_userinfo(cls):
        '''each attribute of User is defined by a user input'''
        return cls(
            raw_input("Welcome. PLease Enter Your First Name: "),
            raw_input("Please Enter Your Last Name: "),
            raw_input("Username: "),
            raw_input("What is your location? : "),
            raw_input("List some of your interests: ")
            )

    def __str__(self):
        '''returns all attributes of User as strings'''
        return "User: {0} {1} \nUsername: {2} \nLocation: {3} \nInterests: {4}".format(self.first_name, self.last_name, self.username, self.location, ','.join(self.interests))

'''creates an instance of User object'''
user1 = User.get_userinfo()
print(user1)
$ python test.txt
Welcome. PLease Enter Your First Name: Hi
Please Enter Your Last Name: How
Username: Are
What is your location? : You
List some of your interests: Ball, Tennis, Python
User: Hi How
Username: Are
Location: You
Interests: Ball, Tennis, Python
...