Python: вызов функции со строкой возвращает описание аргумента - PullRequest
0 голосов
/ 18 мая 2019

Я пытаюсь вызвать функцию со строкой, но при этом функция просто использует имя аргумента для этой функции.

Моя функция определяется как сортировка (атрибут), и когда я вызываю ее, например, с помощью сортировки («возраст»), она использует «атрибут», а не «возраст».

Вот код, я довольно новичок в python, так что, вероятно, что-то очевидное, с чем я не знаком.

def sortering(attribut):
 try:
    val1 = input("Vill du sortera stigande eller fallande? s/f")
    if val1 == "s":
        djurlista.sort(key=lambda x: x.attribut)
        print(*djurlista,sep='\n' + ' ' + '\n')
    elif val1 == "f":
        djurlista.sort(key=lambda x: x.attribut, reverse=True)
        print(*djurlista,sep='\n' + ' ' + '\n')
 except ValueError:
    print("Svara med s för stigande eller f för fallande!")


sortering('age')

Список «djurlista» - это список строк, а каждая строка - это объект «Djur» с атрибутами: art, namn, ålder, kön, gravid

Вот этот код:

class Djur:
def __init__(self, art, namn, ålder, kön, gravid):
    self.art = art
    self.namn = namn
    self.age = ålder
    self.gender = kön
    self.gravid = gravid

    x = Djur(art, namn, ålder, kön, gravid)
    self.djurlista.append(x)
def __str__(self):
    return ("Art: " + str(self.art) + " " + "\n"
            "Namn: " + str(self.namn) + " " + "\n"
            "Ålder: " + str(self.age) + " " + "\n"
            "Kön: " + str(self.gender) + " " + "\n"
            "Gravid: " + str(self.gravid))
def __repr__(self):
    return str(self)

Ответы [ 3 ]

0 голосов
/ 18 мая 2019

Похоже, что вы пытаетесь получить параметр .attribut из глобального класса / obj с именем x (через x.attribut), который должен выдавать ошибку, если он не существует, но может и не быть, если онхранится в вашем питоне как-нибудь.

Если вы удалите х.перед ссылкой на attribut, вы все еще получаете ту же ошибку?

0 голосов
/ 19 мая 2019

Вместо x.attribut (где attribut - строка, а x - Djur экземпляр), вы должны использовать [Python 3.Docs]: встроенные функции - getattr ( объект, имя [, по умолчанию] ) :

djurlista.sort(key=lambda x: getattr(x, attribut))
0 голосов
/ 18 мая 2019

Используйте x [attribut], а не x.attribut

def sortering(attribut):
 try:
    val1 = input("Vill du sortera stigande eller fallande? s/f")
    if val1 == "s":
        djurlista.sort(key=lambda x: x[attribut])
        print(*djurlista,sep='\n' + ' ' + '\n')
    elif val1 == "f":
        djurlista.sort(key=lambda x: x[attribut], reverse=True)
        print(*djurlista,sep='\n' + ' ' + '\n')
 except ValueError:
    print("Svara med s för stigande eller f för fallande!")

sortering('age')
...