Python dlaczego ta funkcja raz działa, a po imporcie nie działa

wazer | 2021-02-17 10:25:21 UTC | #1

dlaczego po zaimportowaniu datetime z datetime nie działa datetime.datetime.today()
ten problem nie pojawia się przy getcwd()
    >>> import datetime
    >>> datetime.datetime.today()
    datetime.datetime(2020, 11, 25, 18, 31, 43, 228326)
    >>> from datetime import datetime
    >>> datetime.today()
    datetime.datetime(2020, 11, 25, 18, 31, 58, 838495)
    >>> datetime.datetime.today()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: type object 'datetime.datetime' has no attribute 'datetime'
    >>> import os
    >>> os.getcwd()
    'C:\\Users'
    >>> getcwd()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'getcwd' is not defined
    >>> from os import getcwd
    >>> getcwd()

    >>> os.getcwd()
    'C:\\Users'
    >>>

Pantoflarz | 2020-11-28 17:51:54 UTC | #2

Nie wiem do końca jak to poprawnie wytłumaczyć w języku polskim, gdyż przywykłem do tłumaczenia w języku angielskim, ale postaram się objaśnić co jest problemem.

Gdy importujesz datetime -

[quote=”wazer, post:1, topic:16894”]
import datetime
[/quote]

importujesz tzw. moduł.

Za chwilę, robiąc

[quote=”wazer, post:1, topic:16894”]
from datetime import datetime
[/quote]

importujesz klasę.

Więc to co Python robi to nie błąd, robi dokładnie to co mu kazałeś, a że nazwa tego co importujesz jest taka sama, to prawidłowo zwraca że obiekt nie ma atrybutu datetime.

Najprostszym fixem, w takiej sytuacji, jest zmiana nazewnictwa importów, np. możesz zrobić po prostu -

import datetime as dt

i używać modułu datetime używając zmiennej dt

a potem

from datetime import datetime

i używać klasy datetime używając zmienniej datetime

Przynajmniej tak rozumiem to co się tutaj dzieje, i sądzę że to mogłoby pomóc :slight_smile:

Po co wogóle komplikujesz sobie na tyle życie jest dla mnie zagadką, bo można po prostu nie robić import datetime from datetime i używając samego dt, kod dt.datetime.now() zwróci Ci aktualną datę i godzinę :)


wazer | 2020-11-28 17:51:07 UTC | #3

Dzięki za wytłumaczenie :slightlysmilingface:

[quote=”Pantoflarz, post:2, topic:16894”]
import datetime as dt
[/quote]
o tym że da się zmienić nazwę modułu nie wiedziałem

[quote=”Pantoflarz, post:2, topic:16894”]
Po co wogóle komplikujesz sobie na tyle życie jest dla mnie zagadką, bo można po prostu nie robić import datetime from datetime i używając samego dt, kod dt.datetime.now() zwróci Ci aktualną datę i godzinę
[/quote]
Byłem ciekawy co się stanie .....


system | 2021-02-17 10:31:44 UTC | #4

Ten temat został automatycznie zamknięty 32 dni po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe.