Операции части прерывания в Python

Используя Java 6 или позже, опция пути к классу поддерживает подстановочные знаки. Отметьте следующее:

  • Использование прямо заключает в кавычки (")
  • Использование *, не *.jar

Windows

java -cp "Test.jar;lib/*" my.package.MainClass

Unix

java -cp "Test.jar:lib/*" my.package.MainClass

, Это подобно Windows, но использует : вместо ;. Если Вы не можете использовать подстановочные знаки, bash позволяет следующий синтаксис (где lib каталог, содержащий все архивные файлы Java):

java -cp $(echo lib/*.jar | tr ' ' ':')

(Отмечают, что использование пути к классу является несовместимым с -jar опция. См. также: Выполняют файл банки с несколькими библиотеками пути к классу от командной строки )

Подстановочные знаки Понимания

От Путь к классу документ:

записи Пути к классу могут содержать подстановочный символ * базового имени, который считают эквивалентным определению списка всех файлов в каталоге с расширением .jar или .JAR. Например, запись пути к классу foo/* определяет все файлы JAR в каталоге, названном нечто. Запись пути к классу, состоящая просто из [1 115], расширяется до списка всех файлов банки в текущем каталоге.

запись пути к классу А, которая содержит *, не будет соответствовать файлам класса. Для соответствия обоим классам и файлам JAR в единственном нечто каталога используйте или foo;foo/* или foo/*;foo. Выбранный порядок определяет, загружаются ли классы и ресурсы в [1 119] перед файлами JAR в [1 120], или наоборот.

Подкаталоги не ищутся рекурсивно. Например, foo/* ищет файлы JAR только в [1 122], не в [1 123], foo/baz, и т.д.

порядок, в котором файлы JAR в каталоге перечисляются в расширенном пути к классу, не определяется и может варьироваться от платформы до платформы и даже с момента до момента на той же машине. Хорошо созданное приложение не должно зависеть ни от какого конкретного порядка. Если определенный порядок требуется тогда, файлы JAR могут быть перечислены явно в пути к классу.

Расширение подстановочных знаков сделано рано, до вызова основного метода программы, а не поздно, во время самого процесса загрузки класса. Каждый элемент входного пути к классу, содержащего подстановочный знак, заменяется (возможно пустой) последовательность элементов, сгенерированных путем перечисления файлов JAR в именованном каталоге. Например, если каталог foo содержит a.jar, b.jar, и c.jar, то путь к классу foo/* расширен в [1 130], и та строка была бы значением системного свойства java.class.path.

CLASSPATH, переменную среды не рассматривают никто по-другому по сравнению с -classpath (или -cp) параметр командной строки. Таким образом, подстановочные знаки соблюдают во всех этих случаях. Однако подстановочные знаки пути к классу не соблюдают в Class-Path jar-manifest заголовок.

Примечание: из-за известной ошибки в java 8, примеры окон должны использовать обратную косую черту, предшествующую записям с запаздывающей звездочкой: https://bugs.openjdk.java.net/browse/JDK-8131329

10
задан erik 22 July 2009 в 18:28
поделиться

4 ответа

Достаточно предположений. Давайте начнем использовать факты, не так ли? Насколько я могу судить, суть в том, что вы должны переопределить оба набора методов.

Если вы хотите реализовать отмену / возврат, вам, вероятно, следует попробовать использовать стек отмены и набор действий, которые могут выполнять () / undo () сами.

Код

import profile
import sys

print sys.version

class InterceptedList(list):

    def addSave(func):
        def newfunc(self, *args):
            func(self, *args)
            print 'saving'
        return newfunc

    __setslice__ = addSave(list.__setslice__)
    __delslice__ = addSave(list.__delslice__)


class InterceptedList2(list):

    def __setitem__(self, key, value):
        print 'saving'
        list.__setitem__(self, key, value)

    def __delitem__(self, key):
        print 'saving'
        list.__delitem__(self, key)


print("------------Testing setslice------------------")
l = InterceptedList()
l.extend([1,2,3,4])
profile.run("l[3:] = [5]")
profile.run("l[2:6] = [12, 4]")
profile.run("l[-1:] = [42]")
profile.run("l[::2] = [6,6]")

print("-----------Testing setitem--------------------")
l2 = InterceptedList2()
l2.extend([1,2,3,4])
profile.run("l2[3:] = [5]")
profile.run("l2[2:6] = [12,4]")
profile.run("l2[-1:] = [42]")
profile.run("l2[::2] = [6,6]")

Jython 2.5

C:\Users\wuu-local.pyza\Desktop>c:\jython2.5.0\jython.bat intercept.py
2.5.0 (Release_2_5_0:6476, Jun 16 2009, 13:33:26)
[Java HotSpot(TM) Client VM (Sun Microsystems Inc.)]
------------Testing setslice------------------
saving
         3 function calls in 0.035 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:0(<module>)
        1    0.000    0.000    0.000    0.000 intercept.py:9(newfunc)
        1    0.034    0.034    0.035    0.035 profile:0(l[3:] = [5])
        0    0.000             0.000          profile:0(profiler)


saving
         3 function calls in 0.005 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.001    0.001 <string>:0(<module>)
        1    0.001    0.001    0.001    0.001 intercept.py:9(newfunc)
        1    0.004    0.004    0.005    0.005 profile:0(l[2:6] = [12, 4])
        0    0.000             0.000          profile:0(profiler)


saving
         3 function calls in 0.012 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:0(<module>)
        1    0.000    0.000    0.000    0.000 intercept.py:9(newfunc)
        1    0.012    0.012    0.012    0.012 profile:0(l[-1:] = [42])
        0    0.000             0.000          profile:0(profiler)


         2 function calls in 0.004 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:0(<module>)
        1    0.004    0.004    0.004    0.004 profile:0(l[::2] = [6,6])
        0    0.000             0.000          profile:0(profiler)


-----------Testing setitem--------------------
         2 function calls in 0.004 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:0(<module>)
        1    0.004    0.004    0.004    0.004 profile:0(l2[3:] = [5])
        0    0.000             0.000          profile:0(profiler)


         2 function calls in 0.006 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:0(<module>)
        1    0.006    0.006    0.006    0.006 profile:0(l2[2:6] = [12,4])
        0    0.000             0.000          profile:0(profiler)


         2 function calls in 0.004 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:0(<module>)
        1    0.004    0.004    0.004    0.004 profile:0(l2[-1:] = [42])
        0    0.000             0.000          profile:0(profiler)


saving
         3 function calls in 0.007 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.002    0.002 <string>:0(<module>)
        1    0.001    0.001    0.001    0.001 intercept.py:20(__setitem__)
        1    0.005    0.005    0.007    0.007 profile:0(l2[::2] = [6,6])
        0    0.000             0.000          profile:0(profiler)

Python 2.6.2

C:\Users\wuu-local.pyza\Desktop>python intercept.py
2.6 (r26:66721, Oct  2 2008, 11:35:03) [MSC v.1500 32 bit (Intel)]
------------Testing setslice------------------
saving
         4 function calls in 0.002 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.002    0.002    0.002    0.002 :0(setprofile)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 intercept.py:9(newfunc)
        1    0.000    0.000    0.002    0.002 profile:0(l[3:] = [5])
        0    0.000             0.000          profile:0(profiler)


saving
         4 function calls in 0.000 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 :0(setprofile)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 intercept.py:9(newfunc)
        1    0.000    0.000    0.000    0.000 profile:0(l[2:6] = [12, 4])
        0    0.000             0.000          profile:0(profiler)


saving
         4 function calls in 0.000 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 :0(setprofile)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 intercept.py:9(newfunc)
        1    0.000    0.000    0.000    0.000 profile:0(l[-1:] = [42])
        0    0.000             0.000          profile:0(profiler)


         3 function calls in 0.000 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 :0(setprofile)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 profile:0(l[::2] = [6,6])
        0    0.000             0.000          profile:0(profiler)


-----------Testing setitem--------------------
         3 function calls in 0.000 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 :0(setprofile)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 profile:0(l2[3:] = [5])
        0    0.000             0.000          profile:0(profiler)


         3 function calls in 0.000 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 :0(setprofile)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 profile:0(l2[2:6] = [12,4])
        0    0.000             0.000          profile:0(profiler)


         3 function calls in 0.000 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 :0(setprofile)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 profile:0(l2[-1:] = [42])
        0    0.000             0.000          profile:0(profiler)


saving
         4 function calls in 0.003 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 :0(setprofile)
        1    0.000    0.000    0.003    0.003 <string>:1(<module>)
        1    0.002    0.002    0.002    0.002 intercept.py:20(__setitem__)
        1    0.000    0.000    0.003    0.003 profile:0(l2[::2] = [6,6])
        0    0.000             0.000          profile:0(profiler)
5
ответ дан 3 December 2019 в 20:06
поделиться

Из документов Python 3 :

__getslice__(), __setslice__() and __delslice__() were killed. 
The syntax a[i:j] now translates to a.__getitem__(slice(i, j)) 
(or __setitem__() or __delitem__(), when used as an assignment 
or deletion target, respectively).
5
ответ дан 3 December 2019 в 20:06
поделиться

"setslice" и "delslice" устарели, если вы хотите выполнить перехват, вам необходимо работать с объектами фрагментов Python, переданными в "setitem" и "delitem". Если вы хотите использовать как срезы, так и обычный доступ, этот код отлично работает в python 2.6.2.

class InterceptedList(list):

def addSave(func):
    def newfunc(self, *args):
        func(self, *args)
        print 'saving'
    return newfunc

def __setitem__(self, key, value):
    print 'saving'
    list.__setitem__(self, key, value)

def __delitem__(self, key):
    print 'saving'
    list.__delitem__(self, key)
5
ответ дан 3 December 2019 в 20:06
поделиться

обстоятельства, при которых вызываются __ getslice __ и __ setslice __ , довольно узкие. В частности, нарезка происходит только при использовании обычного фрагмента, где первый и конечный элементы упоминаются ровно один раз. для любого другого синтаксиса срезов или без срезов вызывается __ getitem __ или __ setitem __ .

4
ответ дан 3 December 2019 в 20:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: