2012-09-21 32 views

Trả lời

4

Bạn không thể sử dụng câu lệnh from __future__ import trong các mẫu Mako. Ở tất cả.

này là do một mẫu Mako được biên dịch vào một tập tin python, và trong trật tự để làm việc này nó thiết lập một số cấu trúc ban đầu ở phía trên cùng của tập tin đó python:

# -*- encoding:ascii -*- 
from mako import runtime, filters, cache 
UNDEFINED = runtime.UNDEFINED 
__M_dict_builtin = dict 
__M_locals_builtin = locals 
_magic_number = 7 
_modified_time = 1348257499.1626351 
_template_filename = '/tmp/mako.txt' 
_template_uri = '/tmp/mako.txt' 
_source_encoding = 'ascii' 
_exports = [] 

Chỉ sau này thiết lập ban đầu là bất kỳ mã nào từ chính mẫu được bao gồm. from __future__ import division của bạn sẽ không bao giờ được đặt trước.

Bạn vẫn có thể sử dụng phân dấu chấm động bằng cách đúc một trong hai toán hạng của toán tử / phân chia đến một float:

>>> 1/2 
0 
>>> float(1)/2 
0.5 

Chừng nào bạn làm theo cách giải quyết mà bạn có thể làm tốt mà không có việc nhập khẩu trong tương lai division.

+0

Có, tôi thấy điều này từ gỡ lỗi (và rằng lỗi là trên dòng 17), nhưng Mike Bayer (techspot.zzzeek.org) là rất thông minh, tôi nghĩ rằng ông đã có một chỗ ở cho nó. Ngoài ra, 'phân chia' không phải là nhập khẩu tương lai duy nhất (' with' xuất hiện trong tâm trí). Tôi đã sử dụng 'float()' trước khi tôi thử điều này. – Hollister

+0

Bạn sẽ phải đưa vào một yêu cầu tính năng để có các câu lệnh 'from __future__ with' được chuyển lên đầu của đầu ra python cho mẫu. Nhưng khi nhập khẩu như vậy có thể thay đổi giàn giáo mẫu có nghĩa là quá, tôi không chắc chắn đó sẽ là một ý tưởng tốt và được chấp nhận bởi Mike Bayer hoặc các nhà bảo trì Mako khác. –

0

Nhập từ __future__ sẽ gọn gàng, nhưng tôi không thể nghĩ cách làm cho nó hoạt động (có thể ai đó quen thuộc hơn với nội bộ của Mako có thể). Martijn giải thích lý do tại sao điều đó là không thể. Tôi có thể đề nghị một vài công việc xung quanh mặc dù.

Nếu có thể, hãy phân chia bên ngoài mẫu và đặt kết quả trong Bối cảnh. Điều này phù hợp với sở thích cá nhân của tôi để giữ càng nhiều logic ra khỏi mẫu càng tốt.

Nếu đó không phải là một tùy chọn có giải pháp hacky, hãy chuyển đổi toán hạng của bạn thành phao. Nếu bạn cần thực hiện việc phân chia này trong một loạt các địa điểm khác nhau, bạn có thể thêm chức năng vào khối cấp mô-đun:

<%! 
    def div(a, b): 
     return float(a)/float(b) 
%> 

Chắc chắn ít thanh lịch hơn những gì bạn nghĩ, nhưng nó sẽ hoạt động.

+0

Phần lớn logic của tôi là trong khung nhìn, nhưng trường hợp này là một số xử lý của mỗi hàng dữ liệu ngay trước khi nó được hiển thị, vì vậy tôi nghĩ rằng tôi sẽ giữ cho mã gần với việc sử dụng nó. Tôi luôn có thể viết một hàm trợ giúp và nhập nó, nhưng điều này sẽ thực sự gọn gàng. – Hollister

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