Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Chuyển đổi tọa độ vị trí thành tuple trong Python

Khi cần chuyển đổi chuỗi tọa độ (coordinates) thành tuple, có thể sử dụng hàm eval().

Hàm eval() phân tích cú pháp biểu thức được truyền vào như một chuỗi và thực thi nó như mã Python. Nó trả về kết quả đánh giá từ biểu thức đó.

⚠️ Cảnh báo bảo mật: eval() thực thi mã tùy ý. Chỉ dùng với dữ liệu tin cậy. Với dữ liệu đầu vào người dùng, hãy dùng cách an toàn hơn (xem dưới).

Ví dụ dùng eval()

# Chuỗi tọa độ dạng "latitude, longitude"
coord_string = "67.5378, -78.8523"
print(f"Chuỗi đầu vào: {coord_string}")

# eval() đánh giá chuỗi như biểu thức tuple
coord_tuple = eval(coord_string)
print(f"Tuple sau chuyển đổi: {coord_tuple}")
print(f"Kiểu dữ liệu: {type(coord_tuple)}")
print(f"Latitude: {coord_tuple[0]}, Longitude: {coord_tuple[1]}")

Kết quả

Chuỗi đầu vào: 67.5378, -78.8523
Tuple sau chuyển đổi: (67.5378, -78.8523)
Kiểu dữ liệu: <class 'tuple'>
Latitude: 67.5378, Longitude: -78.8523

Giải thích

  • Chuỗi "67.5378, -78.8523" là biểu thức tuple hợp lệ trong Python.
  • eval() parse và thực thi chuỗi, trả về tuple (67.5378, -78.8523).
  • Có thể truy cập các phần tử bằng index như tuple bình thường.

⚠️ Rủi ro bảo mật của eval()

# Nguy hiểm! Người dùng có thể nhập mã độc
malicious_input = "__import__('os').system('rm -rf /')"
# eval(malicious_input)  # KHÔNG BAO GIỜ LÀM ĐIỀU NÀY!

Cách an toàn hơn: ast.literal_eval()

import ast

coord_string = "67.5378, -78.8523"
# Chỉ đánh giá literal (số, chuỗi, tuple, list, dict, bool, None)
coord_tuple = ast.literal_eval(coord_string)
print(coord_tuple)  # (67.5378, -78.8523) - An toàn!

Cách an toàn nhất: Tách chuỗi thủ công

def parse_coordinates(coord_str):
    """Chuyển 'lat, lon' thành tuple float an toàn."""
    try:
        parts = coord_str.split(',')
        if len(parts) != 2:
            raise ValueError("Định dạng phải là 'lat, lon'")
        lat = float(parts[0].strip())
        lon = float(parts[1].strip())
        return (lat, lon)
    except ValueError as e:
        print(f"Lỗi: {e}")
        return None

# Test
print(parse_coordinates("67.5378, -78.8523"))   # (67.5378, -78.8523)
print(parse_coordinates("  21.0285 , 105.8542  "))  # (21.0285, 105.8542)
print(parse_coordinates("invalid"))              # None

Khuyến nghị: Dùng ast.literal_eval() cho dữ liệu cấu trúc đơn giản, hoặc parse thủ công cho kiểm soát tốt nhất.