2012-03-03 22 views
8

Tôi đang viết một ứng dụng Django, nơi tôi đang mong đợi sử dụng nhiều lệnh management.py. Tôi thích ý tưởng về chức năng python có thông số với giá trị mặc định, nơi bạn xác định các param như:Đối số Python và thực hành tốt nhất đối số từ khóa

def function(param1=value1) 

Vì vậy, tôi đang viết các lệnh quản lý của tôi như vậy mà bạn nhập vào như sau:

python manage.py createdb user=some_user db_name=some_name 

Vì vậy, xa như tôi có thể nói, lệnh management.py không chấp nhận loại này của danh sách đối số, vì vậy tôi đã tạo ra một helper phải làm như sau:

def process_args(args=None): 
    kwargs = {} 
    if not args: 
     return kwargs 
    for i in args: 
     try: 
      k,v = i.split('=') 
      kwargs[k] = v 
     except ValueError, ve: 
      raise CommandError("Please Enter All Arguments as key=value. e.g. user=admin") 
    return kwargs 

có cách nào tốt hơn để làm điều này?

Trả lời

5

Thay vì cán của riêng bạn, bạn có thể sử dụng phong cách tham số điển hình, và sử dụng một cái gì đó giống như argparse để phân tích nó:

python manage.py createdb --user=some_user --db_name=some_name 

Bạn muốn chỉ định nghĩa phân tích cú pháp lập luận của bạn và sau đó vượt qua đối số args-parse_args() của nó phương pháp.

+0

Tôi đang gặp khó khăn này để làm việc. Lớp BaseCommand cần phải có các tùy chọn được thêm vào option_list của nó để nó nhận ra tùy chọn. Nhưng theo bài viết dưới đây, việc sử dụng make_option đã không được chấp nhận. Do đó tôi muốn sử dụng argparse, nhưng làm cách nào để thêm các đối số vào lớp BaseCommand? –

+1

Thành thật mà nói, tôi sẽ đi với những gì @nrabinowitz đề xuất - sử dụng chức năng tích hợp của Django khi làm việc với Django. – Amber

12

Đã cập nhật: Mỗi @rix, phiên bản sau của Django hiện sử dụng argparse, nên được ưu tiên.

gốc trả lời:

tôi tin rằng phương pháp tiêu chuẩn ở đây là sử dụng optparse, có thể móc vào các tùy chọn hiện phân tích Django sử dụng rồi. Ví dụ from the 1.6 docs:

from optparse import make_option 

class Command(BaseCommand): 
    option_list = BaseCommand.option_list + (
     make_option('--delete', 
      action='store_true', 
      dest='delete', 
      default=False, 
      help='Delete poll instead of closing it'), 
     ) 
    # ... 

Bây giờ bạn có đối số dòng lệnh có sẵn trong từ điển options. Các tài liệu Python nói optparse không được chấp nhận, nhưng tôi cho rằng các tài liệu Django đề xuất nó bởi vì đó là những gì Django sử dụng cho các lệnh quản lý riêng của nó.

+9

Thực sự, bạn sẽ cho tôi -1 để trích dẫn sách hướng dẫn Django về một câu hỏi về thực hành tốt nhất Django, mặc dù tôi lưu ý rằng đề xuất Django đã không được chấp nhận? Nào. – nrabinowitz

+1

Có, xin lỗi. Không khuyên dùng mã không dùng nữa. Nó không quan trọng nếu django sử dụng nó hay không. [Liên quan] (http://blog.zacharyvoase.com/2009/12/09/django-boss/) – wim

+7

Nói chung, tôi đồng ý. Nhưng câu hỏi của OP không phải là về phân tích cú pháp Python arg chung, đó là về cách được khuyến nghị để làm điều này * cho các lệnh quản lý Django *. Và có * là * một cách được đề nghị, sử dụng optparse, trong hướng dẫn sử dụng Django - được đề xuất một phần vì cách đó bạn chơi tốt với phân tích cú pháp riêng của Django. Nó không quan trọng cho dù Django sử dụng nó, nếu bạn đang xây dựng mã để làm việc với Django. – nrabinowitz

3

Documents trên @ Python argparse là rất lớn, nhưng đối với một cách nhanh chóng sao chép dán câu trả lời để giải quyết câu hỏi ban đầu (bài Django 1.8) - ở đây bạn đi:

class Command(BaseCommand): 

    def add_arguments(self, parser): 
     parser.add_argument(
      '-something', 
      action='store', 
      dest='something', 
      default=None, 
      help="something", 
     ) 

    def handle(self, *args, **options): 
     print(options['something']) 

python manage.py your_command -something='something' 
Các vấn đề liên quan