The Polygon constructor is fairly lenient in terms of ring direction/orientation, but the GEOS Polygon object has a normalize() method that will convert the rings to normal/canonical form in place:
>>> ext_coords_cw = ((0, 0), (0, 1), (1, 1), (1, 0), (0, 0))
>>> ext_coords_ccw = ((0, 0), (1, 0), (1, 1), (0, 1), (0, 0))
>>> int_coords_cw = ((0.4, 0.4), (0.4, 0.6), (0.6, 0.6), (0.6, 0.4), (0.4, 0.4))
>>> poly_cw = Polygon(ext_coords_cw, int_coords_cw)
>>> poly_ccw = Polygon(ext_coords_ccw, int_coords_cw)
>>> poly_cw.coords
(((0.0, 0.0), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)), ((0.4, 0.4), (0.4, 0.6), (0.6, 0.6), (0.6, 0.4), (0.4, 0.4)))
>>> poly_ccw.coords
(((0.0, 0.0), (1.0, 0.0), (1.0, 1.0), (0.0, 1.0), (0.0, 0.0)), ((0.4, 0.4), (0.4, 0.6), (0.6, 0.6), (0.6, 0.4), (0.4, 0.4)))
>>> poly_cw.normalize()
0
>>> poly_cw.coords
(((0.0, 0.0), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)), ((0.4, 0.4), (0.6, 0.4), (0.6, 0.6), (0.4, 0.6), (0.4, 0.4)))
>>> poly_ccw.normalize()
0
>>> poly_ccw.coords
(((0.0, 0.0), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)), ((0.4, 0.4), (0.6, 0.4), (0.6, 0.6), (0.4, 0.6), (0.4, 0.4)))
The GEOS library appears to subscribe to a clockwise outer ring rule, which then makes the inner rings counterclock wise.