Πώς μπορώ να ελέγξω αν μια μεταβλητή είναι ακέραιος αριθμός;
Αν χρειαστεί να το κάνετε αυτό, κάντε
isinstance(<var>, int)
εκτός αν είστε σε Python 2.x, οπότε θέλετε
isinstance(<var>, (int, long))
Μην χρησιμοποιείτε το type
. Δεν είναι σχεδόν ποτέ η σωστή απάντηση στην Python, αφού μπλοκάρει όλη την ευελιξία του πολυμορφισμού. Για παράδειγμα, αν υποκλάσεις την κλάση int
, η νέα σου κλάση θα πρέπει να εγγραφεί ως int
, κάτι που η type
δεν θα κάνει:
class Spam(int): pass
x = Spam(0)
type(x) == int # False
isinstance(x, int) # True
Αυτό τηρεί τον ισχυρό πολυμορφισμό της Python: θα πρέπει να επιτρέπετε οποιοδήποτε αντικείμενο που συμπεριφέρεται σαν int
, αντί να επιβάλλετε να είναι ένα τέτοιο αντικείμενο.
Η κλασική νοοτροπία της Python, όμως, είναι ότι είναι πιο εύκολο να ζητάς συγχώρεση παρά άδεια. Με άλλα λόγια, μην'ελέγχετε αν το x
είναι ακέραιος- υποθέστε ότι είναι και πιάστε τα αποτελέσματα της εξαίρεσης αν δεν είναι:
try:
x += 1
except TypeError:
...
Αυτή η νοοτροπία σιγά-σιγά ξεπερνιέται από τη χρήση των αφηρημένων κλάσεων βάσης, οι οποίες σας επιτρέπουν να καταχωρήσετε ακριβώς ποιες ιδιότητες πρέπει να έχει το αντικείμενό σας (πρόσθεση; πολλαπλασιασμός; διπλασιασμός;) κάνοντάς το να κληρονομήσει από μια ειδικά κατασκευασμένη κλάση. Αυτή θα ήταν η καλύτερη λύση, αφού θα επιτρέπει ακριβώς αυτά τα αντικείμενα με τις απαραίτητες και επαρκείς ιδιότητες, αλλά θα πρέπει να διαβάσετε τα έγγραφα για το πώς να τη χρησιμοποιήσετε.
>>> isinstance(3, int)
True
Δείτε εδώ για περισσότερα.
Σημειώστε ότι αυτό δεν βοηθάει αν ψάχνετε για χαρακτηριστικά που μοιάζουν με int
. Σε αυτή την περίπτωση μπορεί να θέλετε να ελέγξετε και για long
:
>>> isinstance(3L, (long, int))
True
Έχω δει ελέγχους αυτού του είδους έναντι ενός τύπου array/index στην πηγή της Python, αλλά δεν νομίζω ότι αυτό είναι ορατό εκτός της C.
Απάντηση του Token SO: Είσαι σίγουρος ότι πρέπει να ελέγξεις τον τύπο του; Είτε μην περνάτε έναν τύπο που δεν μπορείτε να χειριστείτε, είτε μην προσπαθείτε να ξεγελάσετε τους πιθανούς επαναχρησιμοποιητές του κώδικα, μπορεί να έχουν καλό λόγο να μην περνούν ένα int στη συνάρτησή σας.
Βρήκα μια σχετική ερώτηση εδώ στο ίδιο το SO.
Οι προγραμματιστές της Python προτιμούν να μην ελέγχουν τους τύπους αλλά να κάνουν μια συγκεκριμένη λειτουργία τύπου και να πιάνουν μια εξαίρεση TypeError
. Αν όμως δεν ξέρεις τον τύπο τότε έχεις τα εξής.
>>> i = 12345
>>> type(i)
<type 'int'>
>>> type(i) is int
True