Τα πάντα για την Python

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την Python

Δημοσίευσηαπό sokoban4ever » 22 Φεβ 2012, 16:22

Ilias95 έγραψε:Έστω ότι έχουμε μία συνάρτηση.
Κώδικας: Επιλογή όλων
def foo(x, y, z):
print(x, y, z)

Επίσης έχουμε μία πλειάδα:
Κώδικας: Επιλογή όλων
_tuple = ('one', 'two', 'three')

Μπορούμε με κάποιο τρόπο να εκτελέσουμε την συνάρτηση περνώντας σαν ορίσματα αυτά της πλειάδας;
Χωρίς να δώσουμε "foo(_tuple[0], _tuple[1], _tuple[2])" βέβαια.


Φυσικά και μπορούμε!!!
Κώδικας: Επιλογή όλων
>>> def foo(a,b,c):
print (a,b,c)
>>> _tuple = (1,2,3)
>>> foo(*_tuple)
(1, 2, 3)
>>>

Το μυστικό είναι στο αστεράκι ;)
Ελπίζω να βοήθησα
:)
Θέλουμε και μπορούμε να έχουμε μια καλύτερη ζωή και όσο θα ζούμε θα προσπαθούμε να την αποκτήσουμε ακόμα και αν πεθάνουμε προσπαθώντας, και αν κάποια στιγμή λιγίσουμε έχουμε το επίπεδο να πούμε κουράστηκα λίγο να ,να ξαποστάσουμε , ώστε να συνεχίσουμε πάλι δυνατοί ξανά.

Μήνυμα με αγάπη και αληλλεγγύη σε όλους τους ανθρώπους από όλους τους λαούς , ιδίως του Ελληνικού.
Άβαταρ μέλους
sokoban4ever
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 2331
Εγγραφή: 13 Φεβ 2009, 02:22
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 22 Φεβ 2012, 16:42

Τόσα κρυμμένα μυστικά. :)
Αν και τελικά ίσως όντως είναι καλύτερα να το αποφύγω.
Ευχαριστώ!
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 22 Φεβ 2012, 16:44

Τώρα που το ξανά βλέπω νομίζω κατάλαβα τον αστερίσκο.
Πρέπει να είναι το ίδιο που συμβαίνει όταν δηλώνουμε μία συνάρτηση και δίνουμε αστερίσκο.
Έτσι λογικά αν εκτελέσουμε την συνάρτηση με **var θα περιμένει ένα dict.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 22 Φεβ 2012, 20:15

Έχω την παρακάτω δομή φακέλων:
Κώδικας: Επιλογή όλων
├── folder
│   ├── __init__.py
│   ├── test2.py
│   └── test3.py
└── test.py

test.py
Κώδικας: Επιλογή όλων
from folder import test2

test2.py
Κώδικας: Επιλογή όλων
import test3

test3.py
Κώδικας: Επιλογή όλων
print('ok')

Αν τρέξω το test.py με python2:
Κώδικας: Επιλογή όλων
ilias@ilias-pc:~/example$ python test.py
ok
ilias@ilias-pc:~/example$

Αν τρέξω το ίδιο αρχείο με python3:
Κώδικας: Επιλογή όλων
ilias@ilias-pc:~/example$ python3 test.py
Traceback (most recent call last):
File "test.py", line 1, in <module>
from folder import test2
File "/home/ilias/example/folder/test2.py", line 1, in <module>
import test3
ImportError: No module named test3
ilias@ilias-pc:~/example$


Γιατί συμβαίνει αυτό; Έχει να κάνει με το ότι η python3 οργανώνει τα .pyc αρχεία σε έναν φάκελο __pycache__;
Αν προσθέσω και print(sys.path) στις δύο περιπώσεις το path είναι διαφορετικό.
Τι πρέπει να κάνω για να το διορθώσω;

Ορίστε και τα παραπάνω αρχεία σε tarball: http://dl.dropbox.com/u/33870708/example.tar
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό medigeek » 22 Φεβ 2012, 20:40

Δοκίμασε να προσθέσεις στο __init__.py:
Κώδικας: Επιλογή όλων
import test2
import test3


Σύμφωνα με κάποιο PEP: http://www.python.org/dev/peps/pep-3100/
έγραψε:Imports [39]
Imports will be absolute by default. [done]
Relative imports must be explicitly specified. [done]

Μάλλον εννοούν πως πρέπει να μπει sys.path.append(path) - μπορεί να μπει στο __init__.py πιστεύω:
Κώδικας: Επιλογή όλων
import os
import sys
sys.path.append(os.path.abspath("."))
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 22 Φεβ 2012, 20:46

Τα δοκίμασα και τα δύο χωρίς αποτέλεσμα.
ImportError και στις δύο περιπτώσεις.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό medigeek » 22 Φεβ 2012, 21:11

Βάλε στο test2.py
Κώδικας: Επιλογή όλων
print(sys.path)


Φαίνεται πως δεν αλλάζει το current working directory, παραμένει στο root path "example".
έγραψε:$ python3 test.py
['/home/savvas/Desktop/example', '/usr/lib/python3.2', '/usr/lib/python3.2/plat-linux2', '/usr/lib/python3.2/lib-dynload', '/usr/local/lib/python3.2/dist-packages', '/usr/lib/python3/dist-packages', '/home/savvas/Desktop/example']
Traceback (most recent call last):
File "test.py", line 1, in <module>
from folder import test2
File "/home/savvas/Desktop/example/folder/test2.py", line 5, in <module>
import test3
ImportError: No module named test3


Άρα στο folder/test2.py:
Κώδικας: Επιλογή όλων
import folder.test3


Δεν χρειάζεται sys.path.append. Αν το χρειάζεσαι, πάλι στο test2.py:
Κώδικας: Επιλογή όλων
import os, sys
sys.path.append(os.path.dirname(__file__))
print(sys.path)

import test3
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 22 Φεβ 2012, 21:15

medigeek έγραψε:Άρα στο folder/test2.py:
Κώδικας: Επιλογή όλων
import folder.test2

Μάλλον εννοείς στο test2.py να το κάνω "import folder.test3" (όχι test2)
Ναι έτσι δουλεύει. Όταν θέλω να τρέξω όμως κατευθείαν το test2.py θα παίρνω πάλι ImportError.
Στην python2 θα δούλευε σωστά και στις δύο περιπτώσεις. :wtf:
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 22 Φεβ 2012, 21:18

Πρόλαβες και έκανες edit ενώ έγραφα. Ναι με τις τελευταίες 3 γραμμές κώδικα που δίνεις δουλεύει σωστά.
Μου φαίνεται χαζό όμως. Γιατί να το αλλάξουν; Σίγουρα δεν υπάρχει άλλος τρόπος;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό medigeek » 22 Φεβ 2012, 21:19

Μια τρίτη λύση είναι να δοκιμάσεις τον δευτερο τρόπο (με το __file__) στο αρχείο __init__.py, νομίζω θα δουλέψει χωρίς να χρειαστεί να το προσθέτεις σε κάθε .py του folder/
Δεν είμαι σίγουρος όμως. Τώρα γιατί το έκαναν, ρώτησέ τους. :P Ασφάλεια μήπως; :)
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι