문제

Python,나는 같은 함수를 작성하는 것이 좋 그 결과를 경우 콘솔라는 자체적으로(주로 사용하기 위해 대화식으로 또는 디버깅을 위해).의 목적을 위해,이 질문에 그것을 말하자 상태를 확인합의 무언가이다.면 나는 다른 사람들은 당신의 응용 프로그램

check_status()

는 것을 보고 다음과 같습니다.

Pretty printer status check 0.02v
NOTE: This is so totally not written for giant robots
=================================
System operational: ... ok
Time to ion canon charge is 9m 21s
Booster rocket in AFTERBURNER state
Range check is optimal
Rocket fuel is 10h 19m 40s to depletion
Beer served is type WICKSE LAGER, chill optimal
Suggested catchphrase is 01_FIGHTING_SPIRIT_GOGOGO
Virtual ... on

그러나,나 또한 그것을 통과하는 출력으로 목록으면 저는 이것에서의 컨텍스트의 변수 지정:

not_robot_stat = check_status()
print not_robot_stat
>>> {'cond_op': 1, 't_canoncharge': 1342, 'stage_booster': 5, 'range_est_sigma': 0.023, 'fuel_est': 32557154, 'beer_type': 31007, 'beer_temp': 2, 'catchphrase_suggestion': 1023, 'virtual_on': 'hell yes'}

그래서...는 방법이 있을 동적으로 알아 내에서,함수의 여부를 출력 할당?나는 다음과 같이 할 수 있는 이에 의지 없이 param 전달하거나,또 다른 기능이 전용합니다.나는 검색을 위한 비트,그리고 무엇에서 조금 그것을 말할 수처럼 보이는 나하 리조트를 재생 wth 바이트 코드.그것은 정말 필요한가?

도움이 되었습니까?

해결책

새로운 솔루션

이는 기능 결과가 자체 바이트 코드를 검사하여 할당에 사용될 때 솔루션이 감지하는 새로운 것입니다. 바이트 코드 작성은 완료되지 않았으며, 정의에 Opcode 모듈을 사용하기 때문에 미래 버전의 Python과 호환되어야합니다.

import inspect, dis, opcode

def check_status():

    try:
        frame = inspect.currentframe().f_back
        next_opcode = opcode.opname[ord(frame.f_code.co_code[frame.f_lasti+3])]
        if next_opcode == "POP_TOP": 
            # or next_opcode == "RETURN_VALUE":
            # include the above line in the if statement if you consider "return check_status()" to be assignment
            print "I was not assigned"
            print "Pretty printer status check 0.02v"
            print "NOTE: This is so totally not written for giant robots"
            return
    finally:
        del frame    

    # do normal routine

    info = {'cond_op': 1, 't_canoncharge': 1342, 'stage_booster': 5}

    return info

# no assignment    
def test1():
    check_status()

# assignment
def test2():
    a = check_status()

# could be assignment (check above for options)
def test3():
    return check_status()

# assignment
def test4():
    a = []
    a.append(check_status())
    return a

해결책 1

이것은 Python -I 또는 PDB에서 디버깅하는 동안 함수를 호출 할 때마다 감지하는 오래된 솔루션입니다.

import inspect

def check_status():
    frame = inspect.currentframe()
    try:
        if frame.f_back.f_code.co_name == "<module>" and frame.f_back.f_code.co_filename == "<stdin>":
            print "Pretty printer status check 0.02v"
            print "NOTE: This is so totally not written for giant robots"
    finally:
        del frame

    # do regular stuff   
    return {'cond_op': 1, 't_canoncharge': 1342, 'stage_booster': 5}

def test():
    check_status()


>>> check_status()
Pretty printer status check 0.02v
NOTE: This is so totally not written for giant robots
{'cond_op': 1, 't_canoncharge': 1342, 'stage_booster': 5}

>>> a=check_status()
Pretty printer status check 0.02v
NOTE: This is so totally not written for giant robots

>>> a
{'cond_op': 1, 't_canoncharge': 1342, 'stage_booster': 5}

test()
>>>

다른 팁

그러나 나는 또한 출력을 목록으로 전달하고 싶습니다.

당신은 "사전으로 출력을 반환" - 조심하십시오 ;-)

당신이 할 수있는 한 가지는 Python 통역사의 능력을 사용하여 모든 표현식의 결과를 문자열로 자동 변환하는 것입니다. 이렇게하려면 사용자 정의 서브 클래스를 만듭니다 dict 그것은 문자열로 자신을 변환하도록 요청할 때, 당신이 원하는 모든 서식을 수행합니다. 예를 들어,

class PrettyDict(dict):
    def __str__(self):
        return '''Pretty printer status check 0.02v
NOTE: This is so totally not written for giant robots
=================================
System operational: ... %s
Time to ion canon charge is %dm %ds
Booster rocket in %s state
 (other stuff)
''' % (self.conf_op and 'ok' or 'OMGPANIC!!!',
       self.t_canoncharge / 60, self.t_canoncharge % 60, 
       BOOSTER_STATES[self.booster_charge],
       ... )

물론 당신은 아마도 코드를 작성하는 더 예쁜 방법을 생각 해낼 수 있지만 기본 아이디어는 __str__ 메소드는 객체의 상태를 나타내는 예쁜 인쇄 문자열을 생성하고 반환합니다. 그런 다음 a PrettyDict 당신의 check_status() 입력 할 때 기능

>>> check_status()

당신은 볼 것입니다

Pretty printer status check 0.02v
NOTE: This is so totally not written for giant robots
=================================
System operational: ... ok
Time to ion canon charge is 9m 21s
Booster rocket in AFTERBURNER state
Range check is optimal
Rocket fuel is 10h 19m 40s to depletion
Beer served is type WICKSE LAGER, chill optimal
Suggested catchphrase is 01_FIGHTING_SPIRIT_GOGOGO
Virtual ... on

유일한 캐치는 그 것입니다

>>> not_robot_stat = check_status()
>>> print not_robot_stat

문자열로의 동일한 변환이 print 기능. 그러나 실제 응용 프로그램에서 이것을 사용하기 위해서는 그것이 중요하다고 의심합니다. 반환 가치를 순수한 독점으로보고 싶었다면

>>> print repr(not_robot_stat)

대신, 그것은 당신을 보여줄 것입니다

{'cond_op': 1, 't_canoncharge': 1342, 'stage_booster': 5, 'range_est_sigma': 0.023, 'fuel_est': 32557154, 'beer_type': 31007, 'beer_temp': 2, 'catchphrase_suggestion': 1023, 'virtual_on': 'hell yes'}

요점은 다른 포스터가 말했듯이, 파이썬의 기능이 반환 값으로 무엇을 할 것인지 알 수있는 방법이 없다는 것입니다 (편집하다: 알겠습니다. 어쩌면 이상한 바이트 코드 하킹 방식이있을 수 있지만 그렇게하지는 않습니다. 그러나 중요한 경우에는 그 일을 할 수 있습니다.

이에 대한 사용 사례는 없습니다. Python은 모든 대화식 결과를 명명 된 특수 변수에 할당합니다. _.

대화식으로 다음을 수행 할 수 있습니다. 잘 작동합니다. 재미있는 사업이 없습니다.

>>> check_status()
{'cond_op': 1, 't_canoncharge': 1342, 'stage_booster': 5, 'range_est_sigma': 0.023, 'fuel_est': 32557154, 'beer_type': 31007, 'beer_temp': 2, 'catchphrase_suggestion': 1023, 'virtual_on': 'hell yes'}

>>> pprint.pprint( _ )
{'beer_temp': 2,
 'beer_type': 31007,
 'catchphrase_suggestion': 1023,
 'cond_op': 1,
 'fuel_est': 32557154,
 'range_est_sigma': 0.023,
 'stage_booster': 5,
 't_canoncharge': 1342,
 'virtual_on': 'hell yes'}

기능이 반환 값을 어떻게 사용하는지 알 수있는 방법은 없습니다.

글쎄, 당신이 언급했듯이, 심각한 바이트 코드 해킹은 그것을 할 수 있지만, 정말로 복잡하고 깨지기 쉬울 것입니다. 더 간단한 명시 적 경로로 이동하십시오.

있는 경우에도 이렇게 하는 방법,그것은 나쁜 생각이 아니다.상상을 디버깅하는가에 따라 다르게 동작하는 컨텍스트라고합니다.지금 시도 상상하는 여섯 개월에서 지금이 묻혀서 부분의 일부는 시스템의 유지에 너무 큰에서 당신의 머리를 한 번에 모두.

단순하게 유지합니다.명시적이 더 나은 암시적입니다.그냥 예쁜 인쇄 기능(또는 사용 static 모듈)및 호출에 그 결과입니다.대화형 Pythn 세션할 수 있습______를 사용하여 값을 얻을의 마지막 표현이다.

함수 호출과 할당이 완전히 독립적 인 작업이기 때문에 서로에 대한 인식이 없기 때문에 최소한 정상 구문 절차와 관련이 없습니다.

내가 볼 수있는 가장 간단한 해결 방법은 깃발을 당신에게 arg로 전달하는 것입니다. check_status 기능하고 그에 따라 처리하십시오.

def check_status(return_dict=False) :
    if return_dict :
        # Return stuff here.
    # Pretty Print stuff here.

그리고...

check_status() # Pretty print
not_robot_stat = check_status(True) # Get the dict.

편집 : 나는 당신이 당신이 할당하는 것보다 더 자주 인쇄 할 것이라고 생각했습니다. 그렇지 않은 경우 기본값과 전달한 값을 교환하십시오.

당신이 원하는 것을 할 수있는 유일한 방법은 실제로 "바이트 코드를 사용하는 것"입니다. 그 정보를 복구 할 수있는 다른 방법은 없습니다. 물론 훨씬 더 좋은 방법은 두 가지 별도의 기능을 제공하는 것입니다. 하나는 DITT로 지위를 얻고 다른 하나는 첫 번째 하나를 호출하여 포맷하는 것입니다.

또는 (우수한 아키텍처는 아님)이 두 가지 방식 으로이 두 가지 방식으로 행동하기 위해 선택적인 매개 변수를 취하는 단일 함수를 가질 수 있습니다. 함수는 하나의 함수를 가져야하기 때문에 우수하지 않습니다. 즉, 기본적으로 하나의 기능을 수행해야합니다. 이와 같은 것들.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top