• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

LNU python else i finally

Object Storage Arubacloud
0 głosów
411 wizyt
pytanie zadane 27 maja 2023 w Python przez agantka Nowicjusz (150 p.)
zmienione kategorie 5 lipca 2023 przez Comandeer

Zadanie:

obok zakładki z kodem źródłowym znajdziesz plik data.txt. Do funkcji addData() przez parametr przekazano pewną wartość. Jeżeli wartość jest typu string (łańcuch), funkcja powinna dopisać ją w nowym wierszu do pliku data.txt. Jeżeli wartość jest innego typu, funkcja powinna zwrócić wartość
​"Type error". Jeżeli plik został otwarty i nie zgłoszono wyjątku, funkcja powinna zamknąć plik i zwrócić wartość "Done". 

Przykłady:

data.txt:

Monty
Python


1.
Wejście: "The larch"

Wyjście: "Done"

data.txt

Monty
Python
The larch


2. 
Wejście: 123

Wyjście: "Type error"

data.txt:

Monty
Python

 

Nie rozumiem dlaczego program nie zwraca mi "done".

def addData(data):
    if isinstance(data, str):
        try:
            with open("data.txt", "a") as file:
                file.write(data + "\n")
            return "Done"
        except Exception:
            return "Error writing to file"
    else:
        return "Type error"

 

komentarz 27 maja 2023 przez reaktywny Nałogowiec (40,950 p.)
Nie sprawdzałem kodu, ale może to sprawa wcięć (spacji) - problem powszechny w pythonie :)

2 odpowiedzi

0 głosów
odpowiedź 27 maja 2023 przez VBService Ekspert (252,660 p.)
wybrane 27 maja 2023 przez agantka
 
Najlepsza

IMO Twój kod działa poprawnie on-line.

W dokumentacji jest nawet

The isinstance() built-in function is recommended for testing the type of an object, because it takes subclasses into account.

 

BTW, w zależności od kontekstu i potrzeb, można zdecydować, która funkcja jest bardziej odpowiednia. Jeśli chcesz sprawdzić konkretny typ obiektu, type() może być bardziej odpowiednie. Jeśli natomiast chcesz uwzględnić dziedziczenie i sprawdzić, czy obiekt jest instancją danego typu lub jednego z jego podtypów, isinstance() jest lepszym wyborem.

Ja użyłbym w tym zadaniu, on-line.

if type(data) == str:

 

komentarz 27 maja 2023 przez agantka Nowicjusz (150 p.)
niestety nadal nie działa

PASS addData((58, ('Faith', {'Ebony': 74}))): Result: 'Type error' Expected: 'Type error'

FAILED addData(Joy Cotton lives in Leczna since 19 years.): Result: Wrong data.txt content Expected: 'Done'

komentarz 27 maja 2023 przez VBService Ekspert (252,660 p.)

No bo zapis:

addData(Joy Cotton lives in Leczna since 19 years.):

nie jest string-iem, zapisz tak

addData("Joy Cotton lives in Leczna since 19 years."):

1
komentarz 27 maja 2023 przez VBService Ekspert (252,660 p.)
edycja 27 maja 2023 przez VBService

Jeżeli taki zapis jest

addData((58, ('Faith', {'Ebony': 74}))):

to w tym przypadku IMO lepiej użyć: isinstance().

 

 

BTW, jak ciekawostka, całość zapisana w try, on-line.

0 głosów
odpowiedź 27 maja 2023 przez Wiciorny Ekspert (269,590 p.)
Problem polega na tym, ze isinstance(data, str) nie jest wystarczający, aby wykryć, czy zmienna data jest liczbą
Z uwagi na to, że liczba 123 nie jest instancją typu str, nie zostanie zgłoszony błąd typu, a kod będzie kontynuowany...
komentarz 27 maja 2023 przez Wiciorny Ekspert (269,590 p.)

Jeśli celem twoim jest np. sprawdzenie czy cos tylko jest stringiem, spróbuj przez wymuszenie konwersji 

 

str_data = str(data)  # Próba konwersji na łańcuch znaków

 

Podobne pytania

0 głosów
2 odpowiedzi 552 wizyt
pytanie zadane 14 kwietnia 2022 w Python przez mewtwo Użytkownik (830 p.)
0 głosów
1 odpowiedź 581 wizyt
pytanie zadane 14 kwietnia 2022 w Python przez mewtwo Użytkownik (830 p.)
+1 głos
1 odpowiedź 374 wizyt
pytanie zadane 14 kwietnia 2022 w Python przez mewtwo Użytkownik (830 p.)

92,536 zapytań

141,377 odpowiedzi

319,452 komentarzy

61,920 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...