2009-04-16 23 views
31

Tôi sử dụng Python CGI. Tôi không thể gọi một hàm trước khi nó được xác định.Thực hiện định nghĩa hàm theo thứ tự tệp python độc lập

Trong Oracle PL/SQL đã có thủ thuật "khai báo chuyển tiếp" này: đặt tên tất cả các hàm ở trên cùng để thứ tự xác định không quan trọng.

Có một mẹo như vậy trong Python không?

dụ:

def do_something(ds_parameter): 
    helper_function(ds_parameter) 
    .... 

def helper_function(hf_parameter): 
    .... 

def main(): 
    do_something(my_value) 

main() 

David là đúng, ví dụ của tôi là sai. gì về:

<start of cgi-script> 

def do_something(ds_parameter): 
    helper_function(ds_parameter) 
    .... 

def print_something(): 
    do_something(my_value) 

print_something() 

def helper_function(hf_parameter): 
    .... 

def main() 
    .... 

main() 

Tôi có thể "chuyển tiếp tuyên bố" các chức năng ở phía trên cùng của kịch bản?

+0

Vì mã ví dụ sẽ hoạt động và không phụ thuộc vào đơn đặt hàng, tôi không nhận được câu hỏi. –

+0

Có thể trùng lặp của [Hàm khai báo ở cuối tệp trong Python] (http://stackoverflow.com/questions/3754240/declare-function-at-end-of-file-in-python) – user

Trả lời

45

Tất cả các chức năng phải được xác định trước khi sử dụng bất kỳ chức năng nào.

Tuy nhiên, các hàm có thể được xác định theo thứ tự bất kỳ, miễn là tất cả được xác định trước khi bất kỳ mã thực thi nào sử dụng hàm.

Bạn không cần "chuyển tiếp" vì tất cả các khai báo hoàn toàn độc lập với nhau. Miễn là tất cả các khai báo đến trước tất cả các mã thực thi.

Bạn đang gặp sự cố? Nếu có, vui lòng đăng mã không hoạt động.


Trong ví dụ của bạn, print_something() không đúng chỗ.

Nguyên tắc: Tất cả chức năng phải được xác định trước khi bất kỳ mã nào công việc thực tế

Do đó, đặt tất cả những điều khoản mà làm việc cuối cùng.

+1

Điều này đúng trong Python 3 hoặc chỉ Python <= 2? –

+0

Tôi nghĩ rằng các tham số mặc định của khai báo hàm yêu cầu một khai báo chuyển tiếp, ví dụ: 'def f (x = g()): .. def g(): ..' sẽ không biên dịch ngay cả khi nó không được sử dụng tại thời điểm khai báo. – mnish

+1

@mnish True, minh họa độc đáo rằng các thông số mặc định ** được đánh giá tại thời gian biên dịch **, thường không phải là những gì được dự định. Sử dụng 'f (x = None): ...' và 'if x là None: x = g()' thay thế. – j08lue

2

Giả sử bạn có một số đoạn mã gọi hàm của bạn chính sau khi nó được xác định, sau đó ví dụ của bạn hoạt động như được viết. Do cách Python được diễn giải, bất kỳ hàm nào được gọi bởi phần thân của do_something không cần phải được định nghĩa khi hàm do_something được định nghĩa.

Các bước mà Python sẽ thực hiện trong khi thực thi mã của bạn như sau.

  1. Xác định hàm do_something.
  2. Xác định hàm helper_function.
  3. Xác định chức năng chính.
  4. (Với giả định của tôi ở trên) Gọi chính.
  5. Từ chính, gọi do_something.
  6. Từ do_something, gọi helper_function.

Thời gian duy nhất mà Python quan tâm là helper_function tồn tại là khi đến bước 6. Bạn sẽ có thể xác minh rằng Python làm cho nó tất cả các cách để bước sáu trước khi đưa ra một lỗi khi nó cố gắng tìm helper_function để nó có thể gọi nó.

1

Tôi chưa bao giờ gặp trường hợp "định nghĩa hàm chuyển tiếp" là cần thiết .. Bạn có thể không đơn giản di chuyển print_something() vào bên trong chức năng chính của mình không ..?

def do_something(ds_parameter): 
    helper_function(ds_parameter) 
    .... 

def print_something(): 
    do_something(my_value) 


def helper_function(hf_parameter): 
    .... 

def main() 
    print_something() 
    .... 

main() 

Python không quan tâm helper_function rằng() được xác định sau khi sử dụng nó trên dòng 3 (trong do_something chức năng)

tôi khuyên bạn nên sử dụng một cái gì đó giống như WinPDB và bước qua mã của bạn. Nó cho thấy độc đáo như thế nào Python của phân tích cú pháp/người thi hành công

16

Một minh họa thậm chí tốt hơn về quan điểm của bạn sẽ được (?):

def main(): 
    print_something() 
    .... 

def do_something(ds_parameter): 
    helper_function(ds_parameter) 
    .... 

def print_something(): 
    do_something(my_value) 


def helper_function(hf_parameter): 
    .... 


main() 

Nói cách khác, bạn có thể giữ định nghĩa của bạn về main() ở phía trên, để chỉnh sửa thuận tiện - tránh thường xuyên cuộn, nếu phần lớn thời gian được dành chỉnh sửa chính.

+1

Đây là lý do tại sao nó làm cho rất nhiều ý nghĩa để tách riêng các khai báo và mã thực thi bằng 'if __name__ ==" __main __ ":' rào cản chung. – j08lue

0
def funB(d,c): 
    return funA(d,c) 

print funB(2,3) 

def funA(x,y): 
    return x+y 

Mã trên sẽ trả về Lỗi. Tuy nhiên, đoạn mã sau là tốt ...

def funB(d,c): 
    return funA(d,c) 

def funA(x,y): 
    return x+y 

print funB(2,3) 

Vì vậy, mặc dù bạn chắc chắn phải xác định các chức năng trước khi bất kỳ công việc thực tế được thực hiện, chúng ta có thể tránh xa nếu bạn không sử dụng các chức năng một cách rõ ràng. Tôi nghĩ rằng điều này là hơi giống với prototyping trong các ngôn ngữ khác ...

Các vấn đề liên quan