Oracle Fusion Middleware là gì

Định danh và kiểu dữ liệu trong Jython

Định danh [identifier] trong Jython được quy định tương tự như Java, đó là tập các từ khóa có sẵn và quy tắc đặt tên cho biến, phương thức, … Danh sách các từ khóa có sẵn xin xem thêm tại: //www.jython.org/jythonbook/en/1.0/LangSyntax.html#identifiers-and-declaring-variables

Các đối tượng dữ liệu [data object] trong Jython
     Các đối tượng dữ liệu trong Jython được xây dựng dựa trên các đặc tả của Python. Các kiểu được đặt tên như integer, long, float, complex, string, tuple, list, dictionary. Jython không có kiểu dữ liệu nếu hiểu theo cách như các ngôn ngữ khác, bởi ở Jython chúng chỉ là các đặc tả dữ liệu [data descriptor] chứ không phải là một class hay instance nào cụ thể. Các dữ liệu được biểu diễn bởi các Java class nằm trong package org.python.core, do đó Jython không có kiểu dữ liệu nguyên thủy.
     Tên các Java class biểu diễn các kiểu của Python được đặt tiếp đầu ngữ là “Py”, ví dụ PyInteger, PyComplex, PyTuple, … Các class dùng cho dữ liệu có tính động, và được quyết định lúc thực thi.

Kiểu dữ liệu số [Numeric]
     Các class có vai trò biểu diễn các đối tượng numeric của Jython gồm có PyInteger, PyLong, PyFloat và PyComplex. Các biến kiểu numeric thu được từ việc gán một giá trị numeric phù hợp, và nếu như ta gán một biến cho một số dạng complex thì số đó sẽ được biểu diễn bởi class PyComplex.

– PyInteger: ứng với kiểu int trong Java, biểu diễn được 4 bytes
– PyLong: ứng với kiểu long trong Java, số được biểu diễn kèm kí tự l hoặc L ở cuối để chỉ định là long
– PyFloat: kiểu dấu chấm động, ứng với kiểu double trong Java, biểu diễn với 8 byte dữ liệu
– PyComplex: Một số phức tạp được biểu diễn bởi hai số chấm động. Trong đó, số đầu tiên biểu diễn phần thực và số thứ hai biểu diễn phần ảo.

Kiểu chuỗi [sequence]
     Các dữ liệu kiểu chuỗi trong Jython được biểu diễn bởi các class PyString, PyTuple, PyList. Trong đó, PyString chỉ chứa các dữ liệu xâu ký tự, còn PyTuple và PyList có thể chứa các phần tử kiểu dữ liệu bất kỳ.
Đặc trưng của kiểu chuỗi so với kiểu số đó là kiểu chuỗi có mô tả độ dài.
     Các kiểu dữ liệu chuỗi có khác nhau chút ít về cách khởi tạo nhưng cùng chung cách truy cập các phần tử đó là dùng cặp ngoặc vuông [] để chỉ định index của phần tử đó. Ví dụ:

>>>#khoi tao
>>>S = "abc"            # This is a string
>>>T = ["a", "b", "c"]  # This is a tuple
>>>L = ["a", "b", "c"]  # This is a list
>>>#Truy cap
>>>S[1]
'b'
>>>T[1]
'b'
>>>L[1]
'b'

    Chỉ số của phần tử trong sequence được tính từ 0 trở đi, từ trái sang phải. Chỉ số này có thể âm, khi đó nó sẽ biểu diễn vị trí tính từ phải sang, khi đó kí tự cuối cùng sẽ có chỉ số là -1. Ví dụ:

>>> string="abc123"
>>> string[-1]
'3'
>>> string[0]
'a'
>>> string[-2]
'2'
>>>

Việc lấy một chuỗi con [sequence’s slice]
     Việc cắt một chuỗi con sẽ được thực hiện bằng cách chỉ định điểm mốc hai đầu chuỗi con cần lấy. Hai chỉ sổ này được phân tách nhau bởi dấu hai chấm. Trong đó, chuỗi được lấy sẽ gồm phần tử có index thứ nhất cho đến phần tử đứng trước vị trí index thứ hai, tức là không bao gồm phần tử index thứ hai.
    Ví dụ:

>>>S = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>>S[3:6] # slice from 3 up to, but not including 6
[4, 5, 6]

    Một chuỗi con dạng S[index1:] sẽ lấy chuỗi tính từ index1 đến kết thúc. Còn một chuỗi con dạng S[4:-2] sẽ lấy từ vị trí thứ 4 đến trước vị trí thứ 2 từ phải sang.

    Jython cũng hỗ trợ sử dụng ba chỉ số để lấy chuỗi con trong một khoảng chỉ định nhưng “nhảy cóc” một số bước chứ không lấy liên tục. Ví dụ một chuỗi con xác định bởi S[2:8:3] sẽ xác định một chuỗi con tính từ vị trí thứ 2 tới trước vị trí thứ 8, trong đó mỗi bước nhảy để lấy phần tử tiếp theo là 3. Cụ thể:

>>> S = 'zahbexlwlvo2 fwzo4rslmd' 
>>> S[2::2] # this slices from index 2 to the endpoint, steping by 2
'hello world'
>>>
>>> L = [1,2,3,4,5,6,7,8,9]
>>> L[-1:3:-1] # last index to third index, indexes step by -1
[9, 8, 7, 6, 5]

    Với các kiểu chuỗi mà không thay đổi được ví dụ như PyString hay PyTuple ta có thể truy cập tới các phần tử, nhưng không thể thay đổi giá trị của chúng được.

Kiểu dữ liệu PyString
     Java class này thừa kế các thuộc tính của Java string theo cách chúng được tạo thành từ các ký tự 2 byte dựa theo chuẩn Unicode 2.0, khác với Pyt thon dựa trên 8bit và 16bit theo chuẩn Unicode 3.0.
     Một đối tượng string được tạo thành từ việc gán một string cho một biến. Để biểu diễn một string, có thể dùng cặp nháy đơn, nháy đôi [‘ hay “] hoặc cặp ba nháy [”’ hay “””]. Các dấu nháy loại này có thể xuất hiện bên trong cặp dấu nháy của loại kia một cách hợp lệ. Cách nhúng dấu nháy vào trong một string để hiển thị nó là hợp lệ, nhưng chỉ với phép ghép giữa các string thuần túy [literal string tức là các string không thay đổi được], chứ không thể đem ghép với các số hay các biến mang giá trị.

Kiểu PyTuple
     Class PyTuple là một dạng chuỗi không sửa đổi được, có thể chứa các tham chiếu tới bất kỳ kiểu dữ liệu nào. Mặc dù nó là immutable nhưng có thể chứa các dữ liệu mutable, điều này có được là bởi vì bản thân nó không chứa dữ liệu thành viên mà chỉ chứa các tham chiếu tới chúng.
     Để biểu diễn một tuple có thể dùng nhiều cách như bao trong cặp [] và mỗi thành phần tách nhau bởi dấu phảy; không dùng cặp ngoặc [] mỗi phần tử tách nhau bởi dấu phảy; hoặc chỉ cặp ngoặc [] cho tuple trống.
     Ví dụ:

>>>t = [1,2,3] 
>>>type[t]

>>>t = 1,2,3
>>>type[t]

>>> type[[1,2,3]]

>>>myTuple = [1, "string", 11.5]  # tuples can contain any object type

     Việc khai báo và khởi tạo một tuple đơn phần tử cũng đòi hỏi phải có thêm một dấu phảy sau phần tử đó:

>>> t1 = ["element one",] 
>>> t2 = "element one",
>>> type[t1]

>>> type[t2]

>>> print t1
['element one',]
>>> print t2
['element one',]

Kiểu PyList
     PyList tương đồng với PyTuple, có điều PyList là mutable, tức có thể sửa đổi trực tiếp giá trị các thành phần trong PyList. Các phần tử trong PyList được bao bởi cặp ngoặc vuông, giống như mảng trong Java.

Kiểu bảng băm, từ điển
     Trong Jython có hai kiểu bảng băm, ánh xạ, hay còn gọi là từ điển. Việc ánh xạ xem như là phép ánh xạ từ một key dạng immutable tới một value. Khác biệt giữa hai kiểu ánh xạ đó là kiểu dữ liệu mà key sử dụng.
   Xét kiểu thứ nhất: PyDictionary
     Kiểu từ điển này tổ hợp từ các cặp key:value được bao bởi cặp {}. Các key có thể có thuộc nhiều kiểu khác nhau, nhưng phải là immutable. Một kiểu mutable không thể được dùng làm key của PyDictionary, ví dụ:

>>> list=[1,2,3,4] # this is a mutable sequence / list
>>> D = {list:"my key is a list"}
Traceback [most recent call last]:
  File "", line 1, in
TypeError: unhashable type: 'list'
>>>

     Một lưu ý quan trọng nữa về key đó là các giá trị số được sử dụng làm key sẽ được hash theo cách mà giá trị của chúng được so sánh. Giá trị PyInteger 1 là một object khác so với PyFloat 1.0, nhưng chúng được so sánh bằng nhau và do đó nảy sinh chuyện có hai key trong một từ điển.

   Kiểu từ điển thứ hai PyStringMap
     Với kiểu từ điển này, chỉ có các xâu ký tự [string] được sử dụng làm key. Khác biệt so với PyDictionary vì PyDictionary nhận bất cứ kiểu immutable nào. Loại object này không đơn giản chỉ là sinh ra từ các nhà phát triển Jython, mà nó vốn được trả về mởi một số hàm có sẵn. Nó sinh ra vì một số lý do hiệu năng.
PyStringMap hầu hết được sử dụng cho các namespace do chúng sử dụng key là các string.

Kiểu PyNone
     None là một trạng thái đặc biệt của giá trị, None cũng tương đương như null trong Java. PyNone là class biểu diễn giá trị None.

Mô hình xử lý ngoại lệ trong Jython

    Tương tự Java, trong Jython cũng cung cấp mô hình try để thực hiện xử lý ngoại lệ [exception handling]. Một số logic xử lý như sau:

try:

    # perform some task that may raise an exception

except Exception, value:

    # perform some exception handling

finally:

    # perform tasks that must always be completed [Will be performed before the exception is # raised.]

   
    Trong logic try-exception-finally, đoạn code tiềm ẩn sẽ được thực thi bởi try, nếu có xuất hiện exception, nó sẽ được đoạn except xử lý [tương tự catch trong Java]. Ví dụ:

>>> myvar = 10

>>> try:

...     1/0

... except BaseException, e:

...     global myvar

...     myvar +=10

...     print "exec except block, because: ", e

... finally:

...     global myvar

...     myvar += 5

...     print "exec finally block."

...

exec except block, because:  integer division or modulo by zero

exec finally block.

>>> print myvar

25

>>>

Cấu trúc try-finally
    Điểm khác biệt so với Java đó là Jython không bắt buộc phải có except [tương đương catch], minh chứng là cấu trúc try-finally

try:

    # perform some tasks that may raise an exception

finally:

    # perform tasks that must always be completed [Will be performed before the exception is # raised.]

Ví dụ:

>>> myvar=10

>>> try:

...     1/0

...     print myvar

... finally:

...     global myvar

...     myvar += 30

...     print "exec finally"

...

:5: SyntaxWarning: name 'myvar' declared global after use

exec finally

Traceback [most recent call last]:

  File "", line 2, in

ZeroDivisionError: integer division or modulo by zero

>>> print myvar

40

>>>

Cấu trúc try-except-else:
     Mệnh đề else có thể được sử dụng cùng với mô hình xử lý ngoại lệ để đảm bảo rằng một số task sẽ chỉ được chạy nếu như không có exception nào trả về. Đoạn code bên trong mệnh đề else chỉ được khởi tạo nếu như không có exception nào được throw và nếu như có bất kỳ exception nào được trả về trong quá trình thực thi else thfi sẽ không thể quay về except được nữa. Ví dụ các hành động commit database sẽ được đặt trong mệnh đề else, bởi vì nếu như một vài transaction được đặt trong try thì ta sẽ không hề mong muốn có một động thái commit nào nếu như có xảy ra exception.
     Cú pháp:

try:

    # perform some tasks that may raise an exception

except:

    # perform some exception handling

else:

    # perform some tasks thatwill only be performed if no exceptions are thrown

Ví dụ:

>>> current_status = 'init'

>>> print current_status

init

>>> try:

...     print "take some risks"

...     1/0

... except:

...     global current_status

...     current_status = 'fail_and_roll_backed'

...     print "roll backed"

... else:

...     global current_status

...     current_status = "commited"

...     print "commited."

...

take some risks

roll backed

>>> print current_status

fail_and_roll_backed

>>>

     Ta có thể tùy chọn việc có chỉ định kiểu exception để bắt hoặc không, việc chỉ định được thực hiện ở khối except. Hoặc có thể chỉ định chung chung một khối except không kèm theo loại exception nào. Tối ưu nhất vẫn là chỉ định kiểu exception mà ta dự đoán trước và cung cấp các giải pháp xử lý nó tối ưu nhất.

Lấy thông tin từ exception trả về
     Nếu như một ngoại lệ ở dạng tổng quát được trả về thì thật khó để xác định xem nguyên nhân xuất hiện nó. Xét ví dụ như sau:

>>> try:

...     8/0

... except Exception, ex1:

...     'An error has occurred'

...

'An error has occurred'

    Để lấy thông tin của ngoại lệ được sinh ra, có một số cách như sau:
dùng hàm type[exception_object] để lấy về kiểu của ngoại lệ. Ví dụ

>>> type[ex1]

>>>

    Hoặc sử dụng một hàm được cung cấp sẵn bởi gói sys có tên là sys.exc_info[]. Ví dụ:

# Perform exception handling without explicitly naming the exception type

>>> x = 10

>>> try:

...     z = x / y

... except:

...     print "Unexpected error: ", sys.exc_info[][0], sys.exc_info[][1]

...

Unexpected error:  name 'y' is not defined

Bắt và xử lý nhiều exception
    Tương tự như cách liệt kê nhiều mệnh đề catch trong Java, ta cũng có thể ghép nhiều mệnh đề except:

>>> x = 10

>>> y = 0

>>> try:

...     z = x / y

... except NameError, err1:

...     print err1

... except ZeroDivisionError, err2:

...     print 'You cannot divide a number by zero!'

...

You cannot divide a number by zero!

    Cũng như Java, việc xử lý ngoại lệ trong Jython là một thao tác tốn kém, do đó nên cân nhắc việc này. Và nếu muốn bắt nhiều ngoại lệ, thì hãy xếp các ngoại lệ hay gặp lên trước nhất, để giảm thiểu các thao tác xử lý.

Tổ chức các cụm xử lý ngoại lệ lồng nhau
    Một chương trình với nhiều cấp xử lý cũng sẽ cần tới nhiều cấp hỗ trợ bắt các ngoại lệ được sinh ra để đảm bảo toàn thể logic chương trình được chạy hết. Tương tự Java, trong Jython ta cũng có thể xây dựng một cấu trúc bắt ngoại lệ đa cấp như sau:

# Perform some division on numbers entered by keyboard

try:

    # do some work

    try:

        x = raw_input ['Enter a number for the dividend:  ']

        y = raw_input['Enter a number to divisor: ']

        x = int[x]

        y = int[y]

    except ValueError:

        # handle exception and move to outer try-except

        print 'You must enter a numeric value!'

    z = x / y

except ZeroDivisionError:

    # handle exception

    print 'You cannot divide by zero!'

except TypeError:

    print 'Retry and only use numeric values this time!'

else:

    print 'Your quotient is: %d' % [z]

   
    Nếu như xuất hiện ValueError exception, thì vẫn có thể có khả năng xuất hiện ZeroDivisionError, TypeError bởi nó thuộc cặp try-except bên ngoài. Nếu tất cả các except không đón nhận được ngoại lệ nào và không có ngoại lệ nào khác sinh ra, thì khối lệnh else sẽ được thực thi.

Trả về một ngoại lệ
    Trong Java ta sử dụng throw/throws để trả về các ngoại lệ, trong Jython ta sử dụng raise để làm điều này. Cú pháp sử dụng raise như sau:

raise ExceptionType or String[, message[, traceback]]

    Ngoại lệ được trả về có thể là ngoại lệ được xây dựng sẵn hoặc ngoại lệ tự định nghĩa.
    Các vấn đề nâng cao hơn, xin vui lòng xem thêm chi tiết tại Jython exception handling

Các lệnh phức hợp
    Các lệnh phức hợp là các lệnh mà gom từ một nhóm [group] hoặc một khối [block] các lệnh đơn. Một số cấu trúc điều khiển như if, for, while đều được xét là các lệnh phức hợp. Cần nhớ lại rằng, Jython không sử dụng các cặp {} nhiều cấp để gom nhóm các khối lệnh theo level, mà Jython sử dụng dấu hai chấm : kèm theo đó là căn lề [indentation] để phân level các khối lệnh.

class
    Lệnh class cho phép định nghĩa một class và scope của nó. Việc gọi một class sẽ dẫn tới việc gọi constructor của nó [nếu được định nghĩa] và kết quả thu được là một instance của class đó.

    Ví dụ:
>>> class Hello:
...     def __init__[self,name="John Doe"]:
...         self.name=name
...     def greeting[self]:
...         print "Hello, %s" % self.name
...
>>> jane=Hello["Jane Doe"]
>>> joe=Hello["Joe"]
>>> default=Hello[]
>>> jane.greeting[]
Hello, Jane Doe
>>> joe.greeting[]
Hello, Joe
>>> default.greeting[]
Hello, John Doe
>>>

    Chi tiết hơn về đặc tính của class, cũng như OOP implement trên Jython ta sẽ bàn tới sau.

def
    Lệnh này cho phép định nghĩa các hàm hoặc các phương thức. Cú pháp như sau:

>def name[[parameters]]:
    statements

for
    For là một cấu trúc điều khiển rất phổ biến, cho phép duyệt lần lượt từng thành viên của một chuỗi, danh sách. Một lệnh for có thể kèm theo một tùy chọn là mệnh đề else. Mệnh đề này sẽ được thực thi sau khi chuỗi/ danh sách trên được thực thi hoàn tất mà không có chỉ thị break hay exception nào xảy ra.
Ngoài việc hỗ trợ khả năng tự tăng index khi duyệt danh sách, Python cũng cung cấp sẵn một biến index tham chiếu tới chỉ số thứ tự của phần tử hiện thời đang duyệt, cho phép ta sử dụng [biến đó được quản lý tự động]. Việc này có thể có được thông qua hàm enumerate[sequence_type]

Ví dụ:

>>> myList = ['jython','java','python','jruby','groovy']
>>> for i in myList:
...     print i
...
jython
java
python
jruby
groovy
>>>
>>> for index, value in enumerate[myList]:
...     print index, value
...
0 jython
1 java
2 python
3 jruby
4 groovy
>>>

    Minh họa sử dụng for để thao tác với dữ liệu của một đối tượng dữ liệu dạng từ điển:

>>> my_dict = {'Jython':'Java', 'CPython':'C', 'IronPython':'.NET','PyPy':'Python'}
>>> for key in my_dict:
...     print key
...
Jython
IronPython
CPython
PyPy
>>> print my_dict.values[]
['Java', '.NET', 'C', 'Python']
>>> for value in my_dict:
...     print value
...
Jython
IronPython
CPython
PyPy
>>>

if
    Lệnh if thực thi một khối lệnh theo điều kiện được chỉ định
cú pháp

if expression:
    statements
elif expression:
    statements
else:
    statements

while
    Lệnh while thực thi một khối lệnh cho đến khi nào biểu thức được cung cấp làm điều kiện vẫn có giá trị true.
cú pháp

while expression:
    statements

Tiếp theo phần 1, phần 2 này chúng ta bắt đầu ngay với việc viết cú pháp 
Đặc điểm cú pháp trong Jython script

  • Line feed [ngắt dòng]: bình thường trong các ngôn ngữ lập trình hay gặp thì dấu chấm phảy [semicolon 😉 được sử dụng để ngắt dòng logic. Tuy nhiên giống như các ngôn ngữ script như linux shell, Jython không sử dụng ký tự kết thúc dòng, mà mỗi dòng lệnh mặc định kết thúc khi có một ký thự ngắt dòng [carriage return]
  •  Semicolon [chấm phảy]: không được sử dụng để ngắt dòng. Chú ý với lệnh print, nó tự chèn thêm xuống dòng.
  • Backslash []: có thể được sử dụng để nối các dòng dài của một lệnh logic
  • open grouping: việc sử dụng các dấu ngoặc [], [], {} cần chú ý rằng, mọi thứ nằm trong một cặp ngoặc dù trên nhiều dòng, thì đều được coi là một dòng.
  • triple quotes [cặp 3 dấu nháy]: cặp ba dấu nháy ”’ hay “”” cho phép bao đóng một string nhằm bỏ qua các dấu nháy xuất hiện bên trong hoặc các ký tự ngắt dòng bên trong đó.
  • Code block [khối lệnh]: Jython không sử dụng cặp ngoặc {} để nhóm một khối các lệnh logic, mà sử dụng căn lề [indention] để phân nhóm cấp độ [level] của từng khối xử lý. Mỗi cấp phân biệt bởi một tab lùi đầu dòng [có thể ứng với 4 dấu cách]
  • Comment: Jython sử dụng dấu # để đánh dấu chuỗi comment

Các lệnh
lệnh đơn
các lệnh đơn trên Jython được viết bởi một mệnh đề đơn, phạm vi trong một dòng logic. Các lệnh này có thể gây nhầm lẫn với các hàm cung cấp sẵn. Các lệnh gồm có các hàm hay các đối tượng đều có giới hạn trong namespace của nó.
assert
Kiểm tra tính đúng sai của biểu thức, nếu sai trả về exception. Nếu có hai biểu thức được sử dụng thì biểu thức thứ hai được sử dụng làm tham số để trả về thông in AssertException. Thiết lập __debug__=0 hoặc option -o ở dòng lệnh sẽ vô hiệu các assert.
Cú pháp:
assert expr [, expr]

Các phép gán
Ngoài phép gán = thì các phép toán được sử dụng cho phép gán gồm có  + =, -=, *=, /=, * * =, %=, < > =, &=, |=, ^=.
var_name assigment_operator value
Ví dụ

>>> myvar=3

>>> myvar +=5

>>> print myvar
8

>>>

Lệnh break
Chức năng tương tự như trên các ngôn ngữ khác, nó ngắt luồng thực thi của khối lặp và tiếp tục thực hiện lệnh phía sau khối lặp.

>>> mylist = ['my', 'name','is','cuong','pham']

>>> for index in mylist:

...     if index == 'is':

...         break

...     print index

...

my

name

>>>

lệnh continue
ngắt xử lý ở vòng lặp hiện thời, tiếp tục lặp với phần tử tiếp theo
Sử dụng lại ví dụ ở trên.

>>> for index in mylist:

...     if index == 'cuong':

...         continue

...     print index

...

my

name

is

pham

>>>

Lệnh del
lệnh del có tác dụng xóa một biến đã được khai báo, biến này có thể nằm trong namespace hiện thời hoặc là một giá trị cụ thể nào đó của list hoặc dictionary. Có thể sử dụng lệnh này để xóa các khai báo biến tạm.
Ví dụ:

>>> mylist = ['my', 'name','is','cuong','pham']

>>> del mylist[3]

>>> for index in mylist:

...     print index

...

my

name

is

pham

>>>

Lệnh exec
lệnh này được dùng để thực thi một đoạn code Jython. Lệnh này đòi hỏi phải có biểu thức đóng vai trò tham số, biểu thức này biểu diễn đoạn code nó cần thực thi. Biểu thức này có thể là một string, một đối tượng file, hay một đối tượng code.
Nếu có hai tham số được cung cấp cho exec[] thì tham số thứ hai được coi là global directories mà đoạn code được thực thi. Nếu có ba tham số được truyền thì tham số thứ nhất là từ điển, tham số thứ hai là global namespace mà đoạn code được thực thi.
Ví dụ

>>> exec['''print "my"''']

my

>>>


Lệnh global

lệnh này chỉ dẫn cho bộ parser [phân tích cú pháp] sử dụng các định danh [identifier] được chỉ định với phạm vi global. Nói cách khác việc này tương đương với khai báo một biến toàn cục.
Xét các ví dụ minh họa sau để thấy tác dụng của lệnh global.

>>> global_var = 20

>>> def test[]:

...     print global_var #that is global variable

...

>>> test[]

20

>>>

Thêm một tham chiếu tới biến global_var ở trên và kiểm tra kết quả:

>>> global_var = 20

>>> def test[]:

...     print global_var # this is still global ?

...     global_var = 15

...

>>> test[]

Traceback [most recent call last]:

  File "", line 1, in

  File "", line 2, in test

UnboundLocalError: local variable 'global_var' referenced before assignment

>>>

    Trong ví dụ này, global_var được coi là một local variable. Tại sao lại xảy ra hiện tượng này ? Hãy nhớ lại cách thức jython xử lý kiểu và biến, tất cả đều được xử lý lúc runtime [bởi không có quá trình compile]. Trong quá trình phương thức test[] được gọi thực thi, nó sẽ được xử lý, trong thân của nó, có một phép gán tới biến global_var, do đó global_var trong phạm vi test[] sẽ được coi là local variable. Với câu lệnh print, biến global_var lúc đó chưa được định nghĩa, gán giá trị do đó một exception trả về.

    Để giải quyết vấn đề này, ta sẽ sử dụng lệnh global như sau:

>>> def test2[]:

...     global global_var # indicate that global_var is on global scope

...     print global_var  # global_var is still global

...     global_var = 30   # change it's value

...

>>> test2[]

20

>>> print global_var

30

>>>

Lệnh import
     Lệnh này cho phép xác định các class có sẵn đặt chúng vào scope đang xử lý và sẵn sàng cho việc triệu gọi để sử dụng. Khác biệt so với Java đó là ta có thể đổi tên [dạng như Alias] các class được import thành tên mình muốn.
     Cú pháp:
import module_name
vd: import javax.swing
from module_name import names
vd: from java.utils import Scanner
from javax.swing import JFrame, JLabel
import module_name as new_name
vd: import javax.swing import JFrame as EnhancedFrame

Lệnh pass
    Lệnh này đơn giản như là một placeholder để giữ chỗ, không thực hiện bất cứ một xử lý nào.

Lệnh print
    Lệnh này sẽ ước lượng một biểu thức, chuyển đổi chúng sang dạng string nếu cần, và đẩy kết quả ra sys.stdout hoặc một object nào đó dạng file được chỉ định với toán tử >>
ví dụ:
print expression

print >> myfileobject, expression

Lệnh raise
    Lệnh này sẽ ước lượng các biểu thức được cung cấp vào và đẩy ra một exception
cú pháp: raise [expression [, expression [,traceback]]]

Lệnh return
    Lệnh này sẽ kết thúc việc thực thi của một phương thức hoặc một hàm, ước lượng kết quả của biểu thức được cung cấp và trả về giá trị của biểu thức đó.
cú pháp: return [expression]

 Kết thúc phần 2. Xin mời đón xem Phần 3 – các lệnh phức hợp

How are you today?
Are you OK? — I hope so
Are you Happy? — I hope so

Today, I will note another tips for installing an Oracle Fusion Middleware product – that is Oracle Service Bus. Graphical setup is complicated for me, so I will choose silent install with response file method for this product. Now, let’s get to work!

Firstly, you have to installed JDK and Oracle WebLogic Server that compatible to the version of this OSB. I think you have to do that step by yourself. If you have any issue for that task, please tell me, I will help you.

Secondly, you have to prepare your Linux system that matches some conditions:
– OS version: One of enterprise-5.4,enterprise-4,enterprise-5,redhat-5.4,redhat-4,redhat-5,SuSE-10,SuSE-11
– install prerequisite package, please note the version, your installed packages have to be equal or higher than required version:
+ gcc-4.1.0-28.4
+ gcc-c++-4.1.0-28.4
+ setarch-1.6-1
+ sysstat-5.0.5-1
+ libstdc++-4.1.0-28.4
+ libstdc++-devel-4.1.0-28.4
+ compat-libstdc++-296-2.96-132.7.2
+ compat-db-4.1.25-9
+ control-center-2.8.0-12
+ glibc-common-2.3.4-2.9
+ binutils-2.16.91.0.5-23.4
+ make-3.80-202.2

– create Linux group and user for installer, for example: oinstall [groupadd oinstall] and oracle [useradd oracle]
– create oraInst.loc file. You can done that mission by your hand or executing the script stage/Response/createCentralInventory.sh with root permission
[oracle@vm1 Disk1]$ mkdir ~/oraInventory
[oracle@vm1 Disk1]$ su
Password:
[root@vm1 Disk1]# sh stage/Response/createCentralInventory.sh /home/oracle/oraInventory/ oinstall
Setting the inventory to /home/oracle/oraInventory/
Setting the group name to oinstall
Creating inventory pointer file in /etc directory
Creating the Oracle inventory pointer file [/etc/oraInst.loc]
Changing permissions of /home/oracle/oraInventory/ to 770.
Changing groupname of /home/oracle/oraInventory/ to oinstall.
The execution of the script is complete
[root@vm1 Disk1]#

Thirdly, you have to prepare a response file for installation options. It’s recommend to copy and edit sample files that located in stage/Response directory. In this post, I decide to use custom installation, so I will edit that file to something like this:

[ENGINE]

#DO NOT CHANGE THIS.
Response File Version=1.0.0.0.0

[GENERIC]

#Set this to true if you wish to specify a directory where latest updates are downloaded. This option would use the software updates from the specified directory
SPECIFY_DOWNLOAD_LOCATION=false

#
SKIP_SOFTWARE_UPDATES=true

#If the Software updates are already downloaded and available on your local system, then specify the path to the directory where these patches are available and set SPECIFY_DOWNLOAD_LOCATION to true
SOFTWARE_UPDATES_DOWNLOAD_LOCATION=

#Write the name of the Oracle Home directory. The Oracle Home directory name may only contain alphanumeric , hyphen [-] , dot [.] and underscore [_] characters, and it must begin with an alphanumeric character.
ORACLE_HOME=/home/oracle/Oracle/Middleware/Oracle_OSB1

#Write the complete path to a valid Middleware Home.
MIDDLEWARE_HOME=/home/oracle/Oracle/Middleware

#Set this to true if typical installation must be done. If this is set to true then wariable "CUSTOM TYPE" must be set to false as the variables are mutually exclusive
TYPICAL TYPE=false

#Set this to true if custom installation must be done, all other required variables need to be provided. If this is set to true then variable "TYPICAL TYPE" must be set to false as the variables are mutually exclusive.
CUSTOM TYPE=true

#Set this to true if component Oracle Service Bus Examples must be installed. This input will be needed only in the case of custom installation
Oracle Service Bus Examples=false

#Set this to true if component Oracle Service Bus IDE must be installed. This input will be needed only in the case of custom installation
Oracle Service Bus IDE=false

#Give the complete path to a valid WebLogic Server Home for the corresponding Middleware Home entered.
WL_HOME=/home/oracle/Oracle/Middleware/wlserver_10.3

#Give the complete path to a valid OEPE Home for the corresponding Middleware Home entered. This input will be needed in both typical and custom installations. But in case of custom installation, Oracle Service Bus IDE must be set to true.
OEPE_HOME=

[SYSTEM]
[APPLICATIONS]
[RELATIONSHIPS]

Finally, just execute installation script to invoke installation wizard on silent mode and pass response file to it. While installation running, you have to provide location of JDK home. Look at my installation console screen

[oracle@vm1 Disk1]$ ./runInstaller -silent -responseFile /home/oracle/custom_installtype.rsp
Starting Oracle Universal Installer...

Checking if CPU speed is above 300 MHz. Actual 2660 MHz Passed
Checking Temp space: must be greater than 150 MB. Actual 1661 MB Passed
Checking swap space: must be greater than 512 MB. Actual 2996 MB Passed
Preparing to launch Oracle Universal Installer from /tmp/OraInstall2012-03-13_02-22-14PM. Please wait ...
Please specify JRE/JDK location [ Ex. /home/jre ], /bin/java should exist :/home/oracle/Oracle/Middleware/jrockit_160_24_D1.1.2-4
[oracle@vm1 Disk1]$ [WARN ][jrockit] MaxPermSize=512m ignored: Not a valid option for JRockit
Log: /home/oracle/oraInventory//logs/install2012-03-13_02-22-14PM.log
Copyright [c] 1999, 2011, Oracle and/or its affiliates. All rights reserved.
Reading response file..
Expected result: One of enterprise-5.4,enterprise-4,enterprise-5,redhat-5.4,redhat-4,redhat-5,SuSE-10,SuSE-11
Actual Result: redhat-5.4
Check complete. The overall result of this check is: Passed
CertifiedVersions Check: Success.
Checking for gcc-4.1.0-28.4; found gcc-4.1.2-51.el5-i386. Passed
Checking for gcc-c++-4.1.0-28.4; found gcc-c++-4.1.2-51.el5-i386. Passed
Checking for setarch-1.6-1; found setarch-2.0-1.1-i386. Passed
Checking for sysstat-5.0.5-1; found sysstat-7.0.2-11.el5-i386. Passed
Checking for libstdc++-4.1.0-28.4; found libstdc++-4.1.2-51.el5-i386. Passed
Checking for libstdc++-devel-4.1.0-28.4; found libstdc++-devel-4.1.2-51.el5-i386. Passed
Checking for compat-libstdc++-296-2.96-132.7.2; Not found. Failed

Chủ Đề